Неочевидное поведение тернарного оператора в PHP
PHP чтивоПосмотрите на данный пример кода и подумайте, что он должен вывести.
$a = 2; echo ( $a == 1 ? 'one' : $a == 2 ? 'two' : $a == 3 ? 'three' : $a == 4 ? 'four' : 'other' );
Конечно же ожидаемый вывод - two, но на самом деле выведется four. Давайте разберемся, почему же так происходит.
Все дело в том, что тернарный оператор в PHP имеет левую ассоциативность (см. официальную документацию). Это означает, что его выполнение будет происходить слева направо.
Для лучшего понимания давайте перепишем вот так
$a = 2; echo ( ((($a == 1 ? 'one' : $a == 2) ? 'two' : $a == 3) ? 'three' : $a == 4) ? 'four' : 'other' );
и рассмотрим этапы выполнения
1. $a == 1 ? 'one' : $a == 2 2. true ? 'two' : $a == 3 3. 'two' ? 'three' : $a == 4 4. 'three' ? 'four' : 'other' 5. echo 'four'
Не очевидно, правда?
В отличие от языков С и С++ (в них правая ассоциативность) тернарный оператор PHP имеет такую особенность. Про неё нужно не забывать и стараться избегать "нагромождения" тернарных выражений или принудительно задавать порядок выполнения при помощи скобок. Вот так
$a = 2; echo ( ($a == 1 ? 'one' : ($a == 2 ? 'two' : ($a == 3 ? 'three' : ($a == 4 ? 'four' : 'other')))) );
Всем добра и кода без багов!
Мы в Telegram - PHP чтиво