6

不应该__isset,因为isset()empty()

4

4 回答 4

17

正如它在此页面上所说:

__isset() 通过在不可访问的属性上调用 isset() 或 empty() 来触发。

empty() 没有专用的魔术方法

如果 __isset() 返回 true,empty() 将调用 __get() 来检查属性的值。

于 2010-03-12T08:37:13.313 回答
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)

于 2010-03-12T09:28:00.997 回答
0

我认为通常您会发现以下是 PHP 等价物:

isset($variable[0])

例如,如果变量是一个字符串,这将检测到该字符串为空。对于大多数原始类型(如果不是全部),它的工作方式类似。

于 2010-03-12T08:34:08.153 回答
0

property_exists()如果您只是测试类变量是否存在,对您不起作用?

于 2010-03-12T08:44:40.413 回答