PHP中用于判断变量是否为空的魔术函数是什么?

7

应该不使用 __isset,因为isset()empty()不是相同的东西。

4个回答

17

根据这个页面的说明:

在访问不可访问属性时调用 isset() 或 empty() ,就会触发 __isset() 方法。

并没有专门用于 empty() 的魔术方法。

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


那么结果始终是相同的还是isset()empty()呢? - user198729
是的,如果您的 __isset 方法返回 true,则 empty() 和 isset() 都将返回 true。您可能应该实现一个“非魔术”方法来检查 empty(),并仅将 __isset 保留为 isset()。 - Inspire
事实上,看起来如果__isset方法返回false,empty()会返回true,但在这种情况下isset()会返回false。如果__isset返回true,则它们都返回true(在PHP 5.3.0上测试)。 - Inspire
那么我猜它首先调用__isset,然后是__get - user198729
那看起来是正确的并且有意义的(我在测试代码中没有编写__get方法,这可能就是为什么empty()一直返回true的原因)。 - Inspire

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";

输出结果为:
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


0

我认为一般来说,以下是PHP的等效代码:

isset($variable[0])

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

我想知道调用哪个神奇函数来检查empty($this->attr) - user198729

0

如果您只是想测试一个类变量是否存在,property_exists() 对您无效吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接