Создание простейших структур SimpleXML - PullRequest
0 голосов
/ 04 января 2019

Может ли кто-нибудь объяснить, почему в 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 - это ноль, и тогда вы можете 't ссылки на свойства необъектов.

Даже в первой ситуации присваивания я ожидаю, что разыменование произойдет до присвоения и завершится неудачей.Но похоже, что там что-то работает по-другому.

1 Ответ

0 голосов
/ 04 января 2019

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, тем не менее, выдает предупреждение.

См. Также Создание объекта по умолчанию из пустого значения в PHP?

...