创建 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?
谁能解释为什么以下内容在 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?