Неочевидное поведение тернарного оператора в PHP

Неочевидное поведение тернарного оператора в 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 чтиво

Report Page