__get魔术函数和空函数的返回不一致

时间:2019-06-12 13:54:13

标签: php

假设我有以下代码:

$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魔术函数是否缺少某些功能?

1 个答案:

答案 0 :(得分:1)

我想您在empty的注释中描述的情况:

  

在无法访问的对象属性上使用empty()时,将调用__isset()重载方法(如果已声明)。

因此,一切都是正确的-__get()不会使用empty来接收值,而只是检查属性是否已定义。为了获得正确的结果,您应该在类中使用以下逻辑定义__isset

public function __isset($prop)
{
    return !empty($this->properties[$prop]);
}