<?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
。或者我在这里遗漏了什么?
答案 0 :(得分:2)
请阅读http://www.virendrachandak.com/techtalk/php-isset-vs-empty-vs-is_null/
答案 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。