Начиная с PHP5.4, PHP выдает предупреждение, когда вы пытаетесь использовать неявное приведение в качестве объекта.
Сообщение: создание объекта по умолчанию из пустого значения
Обычно это можно предотвратить путем явного объявления типа вашей переменной — например,
$thing = new stdClass();
Но это очень раздражает, когда вы начинаете работать с библиотеками, которые конвертируют объекты в XML. Итак, ваш предыдущий код, который сказал
$xml->authentication->identity->accountID->username = "myName";
становится раздутым
$xml = new stdClass();
$xml->authentication = new StdClass();
$xml->authentication->identity = new stdClass();
$xml->authentication->identity->accountID = new stdClass();
$xml->authentication->identity->accountID->username = new stdClass();
$xml->authentication->identity->accountID->username = "myName";
Но в таких случаях, как использование XML, глубокие деревья таких узлов очень распространены.
Есть ли альтернатива явному объявлению каждого уровня каждого узла таким образом, не обманывая его, отключая предупреждения?
Как насчет этого:
class DefaultObject
{
function __get($key) {
return $this->$key = new DefaultObject();
}
}
а потом:
$xml = new DefaultObject();
$xml->authentication->identity->accountID->username = "myName"; // no warnings
Попробуй это:
<?php
class ArrayTree
{
private $nodes = array();
public function __construct() {
}
public function __get($name) {
if( !array_key_exists($name, $this->nodes) ) {
$node = new ArrayTree();
$this->nodes[$name] = $node;
return $node;
}
return $this->nodes[$name];
}
public function __set($name, $value) {
$this->nodes[$name] = $value;
}
// ...
}
$xml = new ArrayTree;
$xml->authentication->identity->accountID->username = 'myName';
var_dump($xml->authentication->identity->accountID->username);