2016-10-25 7 views
0

У меня есть проект Laravel с этим кодом:Почему __isset() не срабатывает в модели 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 

На сервере Dev это работает. На усадьбе $names и $role всегда null. Как я знаю, isset() должен запускать метод __isset() в классе Model, но id нет. версия

Laravel - 5.2.31

PHP на сервере Dev - 7.0.2

PHP на Homestead - 7.0.8-2 + deb.sury.org ~ + 1 дружественный

Это потому, что разница в версиях PHP или есть некоторые настройки?

+1

зачем это? 'isset()' - основная функция PHP. Это абсолютно правильный вызов процедурной функции. –

+0

'first_name' является динамическим свойством. Он не определен в классе 'User'. – xpuc7o

ответ

2

поведение изменилось в 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

__isset() вызывается, когда вы делаете isset() на объект, когда __isset() определен в классе.

сделать в методе __isset в debug_print_backtrace, чтобы увидеть, если его действительно называется

Но что, если какие-либо из выбранных переменных перед установить последнюю попытку разве?

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

+0

'__isset()' определяется в классе «Модель» Ларавеля. Этот код работает на dev-сервере, но не на Homestead. – xpuc7o

+0

так что 'personName' - это класс модели с динамическим свойством' first_name'? – JOUM2

+0

'party' и' personName' являются отношениями в Laravel, они уже определены. 'first_name' является динамическим свойством. – xpuc7o