谁能解释为什么以下代码在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,所以您不能引用非对象的属性。
即使在分配的第一种情况下,我也希望取消引用会在分配之前发生,并且会失败。但看起来那里有些工作方式有所不同。
答案 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
时,它会警告您。