2014-09-24 54 views
1

從PHP5.4開始,當您嘗試使用隱式轉換作爲對象時,PHP會引發警告。PHP5.4 +是否有一種方法可以顯式創建數十個對象以避免警告?

消息:從空值創建默認對象

通常,這可以通過阻止通過顯式地聲明瞭變量類型 - 例如

$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的情況下,像這樣的節點的深度的樹是很常見的。

是否有替代方法以這種方式顯式聲明每個節點的每個級別,而不用通過禁用警告來欺騙它?

回答

4

如何:

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

然後:

$xml = new DefaultObject(); 
$xml->authentication->identity->accountID->username = "myName"; // no warnings 
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); 
相關問題