假设我有以下代码:
$test = $model->contacts;
$test2 = $model->__get('contacts');
$test3 = !empty($test2);
$test4 = !empty($test);
$test5 = !empty($model->contacts);
__get
魔术函数非常简单的地方:
public function __get($prop)
{
return isset($this->properties[$prop]) ? $this->properties[$prop] : null;
}
如何有这些返回值?
$test => App\Models\Contacts[1]
$test2 => App\Models\Contacts[1]
$test3 => true
$test4 => true
$test5 => false
如果将结果存储在变量($test
中,则为空,则返回false
,如果直接调用($test5
),则返回true
。
empty
函数或__get
魔术函数是否缺少某些功能?
答案 0 :(得分:1)
我想您在empty
的注释中描述的情况:
在无法访问的对象属性上使用
empty()
时,将调用__isset()
重载方法(如果已声明)。
因此,一切都是正确的-__get()
不会使用empty
来接收值,而只是检查属性是否已定义。为了获得正确的结果,您应该在类中使用以下逻辑定义__isset
:
public function __isset($prop)
{
return !empty($this->properties[$prop]);
}