使用__isset和__get在无法访问的对象上使用空

时间:2012-10-19 22:45:28

标签: php getter magic-methods

<?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。或者我在这里遗漏了什么?

2 个答案:

答案 0 :(得分:2)

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

  • isset ()只关心存在而不是null-ness
  • ()会考虑数据类型,并且为了考虑数据,它需要值

答案 1 :(得分:0)

在第一次清空时,它正试图&#34;得到&#34; meta所以它可以测试是否&#34; notExisting&#34;元内部是空的。 $ meta只是一个没有魔术方法的通用std类,所以你不会得到任何输出(它不会调用Magic_Methods :: __ get作为$ meta isn&是一个Magic_Methods的实例)。

在第二次调用empty时,它会检查是否设置了meta,它是什么,因此isset返回true。正如claudrian所说,空虚取决于价值,因此它会尝试“获得”#34; meta next,以便确定该值是否为空。它不是空的,所以空返回false。如果将第二个调用更改为empty,则更改为isset,它只调用返回true的isset。