我有一个使用此代码的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版本的不同还是有一些设置?
答案 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)