为什么 __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
我有一个 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