我最近與另一位開發人員討論了PHP的__isset()
和__get()
魔術方法之間的關係。它是由一個我們擁有的類通過__get()
方法延遲加載其他對象(延遲加載意味着該屬性在第一次訪問之前不存在,此時對象被實例化並返回)。不過,我們對__isset()
應該返回尚未加載的屬性有不同意見。該屬性在技術上不存在(它不是集合,或者至少它已設置,但當前爲NULL
),但對它的調用在技術上也會成功(禁止任何例外),並返回一個非NULL
值。PHP:__isset()和__get()之間的關係
所以,我的問題是,在這種情況下應該__isset()
僅僅是爲相同的參數是否__get()
會成功的指標(返回TRUE
如果__get()
會成功,返回非NULL
值)。或者,如果它技術性更強,並且返回FALSE
,由於數據尚不存在(即使它首次訪問時將)?
一個簡單的例子:
class Foo {
protected $data;
public function __get($prop) {
if ($prop == 'bar') {
$this->data['bar'] = new Bar;
return $this->data['bar'];
}
}
public function __isset($prop) {
if ($prop == 'bar') {
// What goes here?
// return isset($this->data[$prop]) would mean
// that the first call to isset($foo->bar) below will be FALSE
// which means that using logic like this would always fail
// and __get() would never be called:
// isset($foo->bar) ? $foo->bar->baz : 'foo->bar not set'
}
}
}
class Bar {}
$foo = new Foo;
var_dump(isset($foo->bar)); // ???
$bar = $foo->bar;
var_dump(isset($foo->bar)); // bool(true)
'__isset'應該檢查'__get'返回的值是否設置爲 – zzzzBov 2012-03-05 14:07:28