1
<?php

class Magic_Methods
{
    protected $meta;

    public function __construct() 
    {
        $this->meta = (object) array(
            'test' => 1
        );
    }

    public function __isset($name) 
    {
        echo "pass isset {$name} \n";

        return isset($this->$name);
    }

    public function __get($name) 
    {
        echo "pass get {$name} \n";

        return $this->$name;
    }
}

$mm = new Magic_Methods();

$meta = empty($mm->meta->notExisting);

var_dump($meta);

echo "||\n";

$meta = empty($mm->meta);

var_dump($meta);

上面的代码片段对我来说没有按预期工作。为什么第一个 empty() 会忽略 __isset?我明白了:

pass get meta 
bool(true)
||
pass isset meta 
pass get meta 
bool(false)

我希望得到相同的结果或另一个传递__isset,但不是直接调用__get. 或者我在这里错过了什么?

4

2 回答 2

2

在这里阅读http://www.virendrachandak.com/techtalk/php-isset-vs-empty-vs-is_null/

  • isset () 只关心存在而不关心是否为空
  • empty () 考虑数据类型,为了考虑数据,它需要值
于 2012-10-19T22:59:05.920 回答
0

在第一次调用 empty 时,它试图“获取”元数据,以便测试元数据内的“notExisting”是否为空。$meta 只是一个没有魔法方法的通用 std 类,所以你不会得到任何输出(它不调用 Magic_Methods::__get,因为 $meta 不是 Magic_Methods 的实例)。

在第二次调用 empty 时,它会检查 meta 是否已设置,因此 isset 返回 true。正如克劳德里安所说,空取决于值,因此它会尝试“获取”元数据,以便确定该值是否为空。它不是空的,因此空返回 false。如果将第二次调用改为空,改为 isset,它只调用返回 true 的 isset。

于 2012-10-19T23:50:15.570 回答