#php #string #concatenation
#php #строка #конкатенация
Вопрос:
Я пытаюсь зарегистрировать некоторые отладочные сообщения при получении ответа, отличного от 200. Ответ имеет response
свойство, которое может быть либо строкой, либо может быть object
свойством сообщения.
Вот мой оператор журнала:
Log::info('Caller non 200 response received. nMessage' . is_object($response->response)?$response->response->message : $response->response);
И я получаю
Попытка получить свойство не-объекта
в вышеупомянутой строке. Я изменил его на:
Log::info('Caller non 200 response received. nMessage' . (is_object($response->response)?$response->response->message : $response->response) );
Обратите внимание на круглые скобки вокруг тернарного оператора, и это работает. Чего мне не хватает?
Также для этого сценария я получаю false
ответ от is_object
вызова.
Комментарии:
1. Если
is_object($response->response)
значение равно false , добавление конкатенации перед ним перед троичным оператором делает случай true и пытается использовать$response->response->message
, когда на самомis_object
деле было false в вашем тесте для содержания свойства response .2. у него есть свойство ответа @JonStirling .. и оно имеет строковое значение.
3. Потому что движок PHP считывает его слева направо и обрабатывает как:
('Caller non 200 response received. nMessage' . is_object($response->response))? ... : ...
что всегда верно.4. @Ultimater Ах, конечно. Стоит добавить ответ 🙂
5. Вот PHP-скрипка, демонстрирующая концепцию: phpfiddle.org/main/code/fpuh-142q
Ответ №1:
Хорошо, получается, что когда вы делаете:
$val = 'some string ' . is_object($notObj) ? 'yes' : 'no'
вычислит $val
некоторую строку yes вместо no
, учитывая, что $notObj
это не объект, и is_object
вернет false
.
Поскольку мы объединяем строку с выводом is_object
, вот почему это оценивается true
как .
Чтобы преодолеть это, вам нужно поместить круглые скобки вокруг тернарного оператора следующим образом:
$val = 'some string ' . (is_object($notObj) ? 'yes' : 'no')
Теперь это будет успешно вычислено $val
до некоторой строки no.
Спасибо @Ultimater за объяснение этого.