应该不使用 __isset
,因为isset()
和empty()
不是相同的东西。
根据这个页面的说明:
在访问不可访问属性时调用 isset() 或 empty() ,就会触发 __isset() 方法。
并没有专门用于 empty() 的魔术方法。
如果 __isset() 返回 true,则 empty() 将调用 __get() 方法来检查属性的值。
class Foo {
public function __isset($name) {
echo "public function __isset($name)\n";
return 'bar'===$name;
}
public function __get($name) {
echo "public function __get($name)\n";
return 'bar'===$name ? 0 : NULL;
}
}
$foo = new Foo;
echo empty($foo->foo) ? ' empty' : ' not empty', "\n";
echo empty($foo->bar) ? ' empty' : ' not empty', "\n";
public function __isset(foo)
empty
public function __isset(bar)
public function __get(bar)
empty
对于第一个属性(foo),empty() 只调用了 __isset() 方法,该方法返回 false -> empty($foo->foo)===true
对于第二个属性(bar),__isset() 被调用并返回 true。然后通过 __get() 获取该属性,并将其解释为布尔值(参见http://docs.php.net/language.types.type-juggling)。由于 (bool)0 是 false
,因此 empty($foo->bar)
也返回 true
。
我认为一般来说,以下是PHP的等效代码:
isset($variable[0])
empty($this->attr)
。 - user198729如果您只是想测试一个类变量是否存在,property_exists()
对您无效吗?
isset()
或empty()
呢? - user198729__isset
,然后是__get
? - user198729