class a {
function __get($property){...}
}
$obj = new a();
var_dump(isset($obj->newproperty));
似乎答案是不可以的,但爲什麼?Will isset()會觸發__get,爲什麼?
class a {
function __get($property){...}
}
$obj = new a();
var_dump(isset($obj->newproperty));
似乎答案是不可以的,但爲什麼?Will isset()會觸發__get,爲什麼?
因爲它檢查__isset而不是使用__get檢索它。
這是一個好得多的選項來調用__isset,因爲什麼是空的沒有標準。也許在類的上下文中null是一個可接受的值。你也可以有一個類,如果該成員不存在,它返回一個新的空對象,這將破壞isset($myObj->item)
,因爲在那種情況下,它總是返回true。
僅當您嘗試訪問不存在的屬性時,纔會調用魔術函數__get。檢查屬性是否存在與檢索屬性不同。
這是完全;你可以使用__isset來代替。這是佈局here。
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")
似乎我沒有在我的例子中定義__isset? – ORM 2010-02-21 18:55:07
似乎你確實沒有 - 但是,如果你已經定義了它,它應該被稱爲;;並且定義或不定義不會在您測試某個屬性是否設置時不會改變關於'__get'的任何內容。 – 2010-02-21 18:56:47