创建 SimpleXML 深层结构

Creating SimpleXML deep structures

谁能解释为什么以下内容在 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,所以不能引用非对象的属性。

即使在赋值的第一种情况下,我也希望取消引用发生在赋值之前并失败。但似乎那里的工作方式有所不同。

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?