Ответ 1
PHP-оценка тернарного (или условного) оператора немного отличается от оценки других языков.
1+1==2 ? 2 : 1+2==2 ? 3 : 2
Большинство языков (например, JavaScript) оценили бы это как:
(1+1==2) ? (2) : ( (1+2==2) ? (3) : (2) )
=> 2
PHP, однако, оценивает это как:
( (1+1==2) ? (2) : (1+2==2) ) ? (3) : (2)
=> 3
Поэтому, поскольку (1+1==2)
оценивает значение true, результат первого тернарного выражения оценивается как 2
, и этот результат затем передается во второе тернарное выражение, которое оценивается как 3
.
Такое поведение упоминается в документации:
Рекомендуется избегать тройных выражений. Поведение PHP при использовании более одного тернарного оператора в одном выражении неочевидно & hellip;
В статье в Википедии об операторе ?:
также упоминается следующее:
Из-за неудачной ошибки в языковой грамматике реализация?: в PHP используется некорректная ассоциативность по сравнению с другими языками & hellip;
Причина в том, что вложение двух условных операторов приводит к возникновению негабаритного состояния с двумя последними параметрами в виде его ветвей:
c1 ? o1 : c2 ? o2 : o3
действительно((c1 ? o1 : c2) ? o2 : o3)
. Это признано и, вероятно, не изменится.
- Смотрите также: Ошибка # 61915