为什么 __isset() 在 Laravel 模型中没有被触发?

Why __isset() is not triggered in Laravel Model?

我有一个 Laravel 项目,代码如下:

$names = isset($user->party->personName->first_name) ? $user->party->personName->first_name . ' ' . $user->party->personName->last_name : null;

$role = $user->userRole->role->name ?? null

在开发服务器上这是有效的。在 Homestead $names$role 总是 null。据我所知,isset() 应该触发 Model class 中的 __isset() 方法,但 id 不会。

Laravel version - 5.2.31

PHP on dev server - 7.0.2

PHP on Homestead - 7.0.8-2+deb.sury.org~xenial+1

是PHP版本不同还是有什么设置?

__isset() 在对象上执行 isset() 时被调用,当 __isset() 在 class.

中定义时

在__isset方法中做一个debug_print_backtrace,看是否真的调用了

但是,如果在最后一个之前选择的任何变量没有设置怎么办?

isset($user->party->personName->first_name)

行为在 PHP 7.0.6 中发生了变化。您可以使用以下内容重现基本示例:

class Foo {
  public function __isset($arg) {
    echo '__isset called', PHP_EOL;
  }
}

$foo = new Foo;

echo 'Basic:', PHP_EOL;
isset($foo->property);

echo 'Deep:', PHP_EOL;
isset($foo->property->child);

在 7.0.6 之前,__isset 方法只被调用到顶层 属性,而现在它被调用到更深的子层 属性。

查看 https://3v4l.org/D389q 了解不同的结果。

它看起来回到了针对此错误应用的修复:https://bugs.php.net/bug.php?id=69659