Троичный оператор и особенность конкатенации строк?

StackOverflow https://stackoverflow.com/questions/1317383

Вопрос

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

Что ж, возможно, здесь есть моя вина

$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';

Я надеюсь, что я прояснил этот вопрос.Приветствую вас.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top