创建SimpleXML深层结构

时间:2019-01-04 11:09:02

标签: php simplexml php-7

谁能解释为什么以下代码在PHP中起作用?

$xml = \simplexml_load_string('<root></root>');
$xml->a->b->c = 123;

(任何深度都可以。)

但是,当尝试直接检查项目时,正如我期望的那样,它将引发参考错误。

$xml = \simplexml_load_string('<root></root>');
var_dump($xml->a->b->c);

因为$xml->a SimpleXMLElement ,而$x->a-b是null,所以您不能引用非对象的属性。

即使在分配的第一种情况下,我也希望取消引用会在分配之前发生,并且会失败。但看起来那里有些工作方式有所不同。

1 个答案:

答案 0 :(得分:2)

当您取消引用PHP时,PHP将从一个空值创建一个默认对象。考虑以下代码,其中尚未分配$foo

php > $foo->bar = 'baz';
PHP Warning:  Creating default object from empty value in php shell code on line 1
php > var_dump($foo);
object(stdClass)#4 (1) {
  ["bar"]=>
  string(3) "baz"
}

因此,这是stdClass对象上的预期行为,因此我认为来自SimpleXML的人员已经复制了该对象。但是,使用stdClass时,它会警告您。

另请参阅Creating default object from empty value in PHP?