【发布时间】:2010-03-12 08:30:37
【问题描述】:
不应该是__isset,因为isset()和empty()不是一回事
【问题讨论】:
标签: php magic-function
不应该是__isset,因为isset()和empty()不是一回事
【问题讨论】:
标签: php magic-function
正如this page 所说:
__isset() 通过在不可访问时调用 isset() 或 empty() 来触发 属性。
empty() 没有专用的魔法方法
如果 __isset() 返回 true,empty() 将调用 __get() 来检查属性的值。
【讨论】:
isset() or empty() ?
__isset,然后调用__get?
作为 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() 也为 empty($foo->bar) 返回 true
【讨论】:
我认为通常你会发现以下是 PHP 的等价物:
isset($variable[0])
例如,如果变量是一个字符串,这将检测到该字符串为空。对于大多数原始类型(如果不是全部),它的工作方式类似。
【讨论】:
empty($this->attr)调用了哪个魔法函数
如果您只是测试类变量是否存在,property_exists() 对您不起作用吗?
【讨论】: