Троичный оператор и особенность конкатенации строк?
-
19-09-2019 - |
Вопрос
Привет, я просто хочу знать, почему этот код выдает (по крайней мере, для меня) неверный результат.
Что ж, возможно, здесь есть моя вина
$description = 'Paper: ' . ($paperType == 'bond') ? 'Bond' : 'Other';
Я предполагал, что если paperType равен 'Bond', то описание - 'Бумага:Bond' и если paperType не равен 'Bond', то описание равно 'Бумага:Другое".
Но когда я запускаю этот код, результатом описания является либо 'Bond', либо 'Other' и оставил меня интересно, где строка 'Paper:" ушел???
Решение
$description = 'Paper: ' . ($paperType == 'bond' ? 'Bond' : 'Other');
Попробуйте добавить круглые скобки, чтобы строка была объединена со строкой в правильном порядке.
Другие советы
Это связано с приоритетом оператора.Вы должны сделать следующее:
$description = 'Paper: ' . (($paperType == 'bond') ? 'Bond' : 'Other');
Я думаю, что все дали решение, я хотел бы рассказать о причине неожиданного результата.
Прежде всего, здесь вы можете проверить происхождение и то, как вычисляются операторы (левый, правый, ассоциативный и т.д.).
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) Теперь у нас есть троичный оператор, мы знаем, что строка оценивается как "true".
// документация php При преобразовании в логическое значение следующие значения считаются ЛОЖНЫМИ:
...пустая строка и строка "0"
$ description = true? 'Bond': 'Other';
3) Наконец-то
$ description = 'bond';
Я надеюсь, что я прояснил этот вопрос.Приветствую вас.