2015-05-12 29 views
3

我遇到了一個有趣的問題。使用[]在同一個操作中創建一個數組屬性並賦值給它似乎出錯了。PHP魔法__get和[]讓價值消失

class T 
{ 
    public function __get($property) 
    { 
     if (!isset($this->{$property})) 
     { 
      $this->{$property} = array(); 
     }   

     return $this->{$property}; 
    } 

    public function __set($key, $val) 
    {  
     $this->{$key} = $val; 
    } 

} 

$testObj = new T(); 

$testObj->testArr[] = 1; 
$testObj->testArr[] = 2;  
$testObj->testArr[] = 3; 

var_dump($testObj->testArr); 

輸出如下:

array(2) { [0]=> int(2) [1]=> int(3) } 

所以1是真的奇蹟般地在數組初始化像帽子兔子消失了。如果我在賦值之前嘗試所有$ testObj-> testArr,或者甚至將1賦值爲$ testObj-> testArr = array(1); - 它工作得很好。但是我想了解這種情況並且有一個通用的解決方案,而不需要首先啓動陣列。有沒有辦法解決這個問題?

+0

您有錯誤報告? – AbraCadaver

+0

您嘗試在創建之前寫入'$ testArr'。如果您在第一次寫入之前從'testArr'讀取:http://3v4l.org/1ED6K,它會起作用 – Rangad

回答

3
$testObj->testArr[] = 1; 

給你一個通知:

注意:過載性能的T間接修改:: $ testArr在test.php的線路上無影響24

確保你」已經得到了你的錯誤報告turned on

0

如果從__get(或任何函數/方法)返回數組,則返回空數組的副本,而不是該數組的引用。這意味着你正在試圖將元素添加到一個沒有名字的變量,一旦你修改它不能被訪問,從而通知:

PHP Notice: Indirect modification of overloaded property T::$testArr has no effect 

然而在接下來的兩個電話由鍵所代表的屬性這是類實例的一個真實部分,所以__get不再被調用。這個變量實際上是存在的,並且您正在追加它,就像您將其他變量作爲類實例的一部分一樣。

你可以看到這是真的加入了當地的數組變量名爲$丘壑類,並改變所有代碼

$this->{$property} 

$this->vals[$property] 

現在你得到通知的3倍,每次調用__get。

相關問題