когда использовать круглые скобки при конкатенации в php

#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 за объяснение этого.