我有一个SimpleXMLElement
的子类,我想要它的类属性,它将为创建的子节点的属性定义一些默认值。
为了设置这些值,我尝试用以下方法覆盖addChild
:
public function addChild($name, $value = '')
{
$child = parent::addChild($name, $enc_val);
error_log(print_r($this->default_link_type, true));
$child->set_default_val($this->default_val);
return $child;
}
问题在于表达式:$this->default_val
不返回属性的值,而是创建一个新的空子对象并返回它。
有人能想到一种方法来覆盖某些属性的行为吗?或者想一想任何一种破解方法,让我对所有这些SimpleXMLElement
子类都有一个全局状态,而不涉及写入文件、键值存储等。?
EDIT:下面的内容不能完全起作用,因为现在当调用asXML()
时,所有元素都将config属性作为子节点。所以我还在寻求解决方案。
通过在PHP的Reflection API中实验各种类/方法,我终于找到了答案。
您可以将其添加到SimpleXMLElement子层,以获取当前对象的属性值:
protected function get_property($name)
{
$rc = new ReflectionClass($this);
$props = $rc->getDefaultProperties();
if (!isset($props[$name])) {
throw new InvalidArgumentException(
'$name does not hold the value of a valid property!'
);
}
return $props[$name];
}
使用ReflectionClass::getProperty()等方法将不起作用。