2010-02-21 108 views

回答

19

因爲它檢查__isset而不是使用__get檢索它。

這是一個好得多的選項來調用__isset,因爲什麼是空的沒有標準。也許在類的上下文中null是一個可接受的值。你也可以有一個類,如果該成員不存在,它返回一個新的空對象,這將破壞isset($myObj->item),因爲在那種情況下,它總是返回true。

0

僅當您嘗試訪問不存在的屬性時,纔會調用魔術函數__get。檢查屬性是否存在與檢索屬性不同。

1

不,__get當您試圖確定是否設置屬性時不應觸發:測試屬性是否設置與嘗試獲取其值不同。

使用isset觸發__isset魔法。

參見:

+0

似乎我沒有在我的例子中定義__isset? – ORM 2010-02-21 18:55:07

+0

似乎你確實沒有 - 但是,如果你已經定義了它,它應該被稱爲;;並且定義或不定義不會在您測試某個屬性是否設置時不會改變關於'__get'的任何內容。 – 2010-02-21 18:56:47

2

這是完全;你可以使用__isset來代替。這是佈局here

0
Class A{ 
    public function __get($key){ 
     ... 
    } 
    public function __set($key,$name){ 
     ... 
    } 
    public function __unset($key){ 
     ... 
    } 
    public function __isset($key){ 
     ... 
    } 
} 
$obj = new A(); 
$get = $obj->newproperty;//$obj->__get("newproperty") 
$obj->newproperty = "X";//$obj->__set("newproperty","X") 
$bool = isset($obj->newproperty);//$obj->__isset("newproperty") 
unset($obj->newproperty);//$obj->__unset("newproperty") 
相關問題