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

时间:2016-10-25 15:56:11

标签: php laravel-5.2 magic-methods

我有一个使用此代码的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

在开发服务器上,这是有效的。家园$names$role始终是null。据我所知,isset()应在__isset()类中触发Model方法,但ID不会。

  

Laravel版本 - 5.2.31

     

开发服务器上的PHP - 7.0.2

     

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

这是因为PHP版本的不同还是有一些设置?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:-1)

当您在对象上执行__isset()时,在类中定义了__isset()时,将调用

isset()

在__isset方法中创建一个debug_print_backtrace,看看它是否真的被称为

但是,如果之前的任何选定变量没有设置呢?

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