PHP5.4 + Есть ли альтернатива явному созданию десятков объектов, чтобы избежать предупреждения?

Начиная с 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, глубокие деревья таких узлов очень распространены.

Есть ли альтернатива явному объявлению каждого уровня каждого узла таким образом, не обманывая его, отключая предупреждения?

1

Решение

Как насчет этого:

class DefaultObject
{
function __get($key) {
return $this->$key = new DefaultObject();
}
}

а потом:

$xml = new DefaultObject();
$xml->authentication->identity->accountID->username = "myName"; // no warnings
4

Другие решения

Попробуй это:

<?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);
0

По вопросам рекламы [email protected]