从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的情况下,这样的节点的深层树很常见。
是否有替代方法可以通过这种方式明确声明每个节点的每个级别而不通过禁用警告来捏造它?
答案 0 :(得分:4)
这个怎么样:
class DefaultObject
{
function __get($key) {
return $this->$key = new DefaultObject();
}
}
然后:
$xml = new DefaultObject();
$xml->authentication->identity->accountID->username = "myName"; // no warnings
答案 1 :(得分:0)
试试这个:
<?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);