【问题标题】:What's the magic function for empty() in PHP?PHP中empty()的神奇功能是什么?
【发布时间】:2010-03-12 08:30:37
【问题描述】:

不应该是__isset,因为isset()empty()不是一回事

【问题讨论】:

    标签: php magic-function


    【解决方案1】:

    正如this page 所说:

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

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

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

    【讨论】:

    • 所以结果总是一样的 or isset() or empty() ?
    • 是的,如果您的 __isset 方法返回 true,empty() 和 isset() 都将返回 true。您可能应该实现一个“非魔法”方法来检查empty(),并只为isset()保留__isset
    • 嗯事实上,如果 __isset 方法返回 false,则 empty() 似乎返回 true,但在这种情况下 isset() 返回 false。如果 __isset 返回 true,它们都返回 true(在 PHP 5.3.0 上测试)
    • 所以我猜它先调用__isset,然后调用__get
    • 这似乎是正确的并且有道理(我没有在我的测试代码中编写 __get 方法,这一定是 empty() 总是返回 true 的原因)。
    【解决方案2】:

    作为 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

    【讨论】:

      【解决方案3】:

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

      isset($variable[0])
      

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

      【讨论】:

      • 我想知道empty($this->attr)调用了哪个魔法函数
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-01
        • 2022-01-25
        • 2011-03-11
        • 1970-01-01
        • 2016-09-08
        • 1970-01-01
        • 2012-01-04
        相关资源
        最近更新 更多