2016-01-27 46 views
4

我有奇怪的問題與魔術吸氣劑/ isset。 我有myObject的定義神奇的getter/isset:奇怪的PHP魔法吸氣劑陣列

private $_data = array(); 

public function __get($name) { 
    if (array_key_exists($name, $this->_data)) return $this->_data[$name]; 
    throw new Exception($name.': property doesn\'t exist.'); 
} 

public function __isset($name) { 
    return isset($this->_data[$name]); 
} 

如果我稱之爲:

isset($myObject->notExisting); 
empty($myObject->notExisting); 

我有正確的行爲(__isset()被調用),而如果我打電話:

isset($myObject->notExisting['ok'])); 
empty($myObject->notExisting['ok'])); 

__get()是__get()時不調用__isset()。

這對我來說似乎很奇怪,因爲PHP在嘗試獲取它之前應該首先檢查$ myObject-> notExisting exists,不是嗎?

回答

3

按照docs

__isset()被調用isset()函數或空()在人跡罕至的屬性觸發。

in isset($myObject->notExisting); isset適用於$myObjectnotExisting財產。

in isset($myObject->notExisting['ok'])); isset applied to ok elements of $myObject->notExisting array。

1

這是正確的行爲。

讓我們條紋這樣的:

isset($myObject->notExisting['ok'])); 

這意味着$ myObject-> notExisting存在,因爲你想獲得與鍵「OK」數組中的對象。所以這將使用__get()方法。

+0

謝謝你們,你們的答案對我來說都很好 –