PHP中的empty()的神奇功能是什么?

use*_*729 6 php magic-function

它不应该__isset,因为isset()不是一样的empty()

Ins*_*ire 17

本页所述:

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

空()没有专门的魔术方法

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


Vol*_*erK 5

作为 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";
Run Code Online (Sandbox Code Playgroud)

输出是

public function __isset(foo)
 empty
public function __isset(bar)
public function __get(bar)
 empty
Run Code Online (Sandbox Code Playgroud)

对于第一个属性 (foo),empty() 只调用了 __isset(),返回 false ->empty($foo->foo)===true
对于第二个属性 (bar),调用了 __isset() 并且返回 true。然后通过 __get() 获取该属性并将其解释为布尔值(请参阅http://docs.php.net/language.types.type-juggling)。由于 (bool)0 是false,empty() 也true返回empty($foo->bar)


Fen*_*ton 0

我认为一般来说您会发现以下是 PHP 的等效内容:

isset($variable[0])
Run Code Online (Sandbox Code Playgroud)

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