不应该是__isset
,因为isset()
与empty()
答案 0 :(得分:17)
正如this page所说:
__ isset()通过在不可访问时调用isset()或empty()来触发 属性。
对于empty()
,没有专门的魔术方法如果__isset()返回true,则empty()将调用__get()来检查属性的值。
答案 1 :(得分:4)
作为Inspire答案的补充:
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()只调用返回false的__isset() - > empty($foo->foo)===true
对于第二个属性(bar),调用了__isset()并返回true。然后通过__get()获取属性并将其解释为布尔值(请参阅http://docs.php.net/language.types.type-juggling)。由于(bool)0为false
,因此empty()也会为true
empty($foo->bar)
答案 2 :(得分:0)
我认为通常你会发现以下是PHP的等价物:
isset($variable[0])
例如,如果变量是一个字符串,则会检测到该字符串为空。对于大多数原始类型(如果不是全部),它的工作方式类似。
答案 3 :(得分:0)
不会property_exists()
为您工作吗?