Тернарный оператор и конкатенация строк? - PullRequest
48 голосов
/ 23 августа 2009

Привет, я просто хочу знать, почему этот код дает (по крайней мере для меня) неверный результат.

Ну, наверное, я здесь виноват

$description = 'Paper: ' . ($paperType == 'bond') ? 'Bond' : 'Other';

Я догадывался, что если paperType равен Bond, то описание будет «Paper: Bond», а если paperType не равно «Bond», то описание будет «Paper: Other».

Но когда я запускаю этот код, результатом является описание «Bond» или «Other» и оставляешь меня интересно, куда пошла строка «Бумага:» ???

Ответы [ 3 ]

91 голосов
/ 23 августа 2009
$description = 'Paper: ' . ($paperType == 'bond' ? 'Bond' : 'Other');

Попробуйте добавить скобки, чтобы строка соединилась со строкой в ​​правильном порядке.

11 голосов
/ 23 августа 2009

Это связано с приоритетом оператора. Вы должны сделать следующее:

$description = 'Paper: ' . (($paperType == 'bond') ? 'Bond' : 'Other');
2 голосов
/ 18 мая 2018

Я думаю, что все дали решение, я хотел бы сообщить причину неожиданного результата.

Прежде всего здесь вы можете проверить происхождение и то, как оцениваются операторы (слева, справа, ассоциативно и т. Д.).

http://php.net/manual/fa/language.operators.precedence.php

Теперь, если мы проанализируем ваше предложение.

$ paperType = 'bond';
$ description = 'Paper:'. ($ paperType == 'bond')? 'Bond': 'Other';

1) Мы просматриваем таблицу и находим, что сначала вычисляются скобки, а затем '.' (конкатенация) вычисляется и в конце тернарный оператор '?', поэтому мы можем связать это следующим образом:

// evaluate the parenthesis ... ($ paperType == 'bond')
$ description = ('Paper:'. 1)? 'Bond': 'Other';
//result
$ description = 'Paper: 1'? 'Bond': 'Other';

2) Теперь у нас есть троичный оператор, мы знаем, что строка оценивается как «истина»

// php документация При преобразовании в логическое значение следующие значения считаются ложными:

... пустая строка и строка "0"

$ description = true? 'Bond': 'Other';

3) Наконец-то

$ description = 'bond';

Надеюсь, я прояснил вопрос. Привет.

...