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