Подтвердить что ты не робот

PHP-тернарный оператор работает не так, как ожидалось

Почему эта печать 2?

echo true ? 1 : true ? 2 : 3;

С моей точки зрения, он должен печатать 1.

Почему он работает не так, как ожидалось?

4b9b3361

Ответ 1

Потому что то, что вы написали, совпадает с:

echo (true ? 1 : true) ? 2 : 3;

и, как вы знаете, 1 оценивается как true.

Что вы ожидаете:

echo (true) ? 1 : (true ? 2 : 3);

Поэтому всегда используйте фигурные скобки, чтобы избежать таких путаниц.

Как уже было написано, тернарные выражения остаются ассоциативными в PHP. Это означает, что сначала будет выполняться первый слева, затем второй и т.д.

Ответ 2

Используйте скобки в случае сомнений.

Тернарный оператор в PHP лево-ассоциативный в отличие от других языков и не работает должным образом.

Ответ 3

Разделите второе тернарное предложение с круглыми скобками.

echo true ? 1 : (true ? 2 : 3);

Ответ 4

из docs

Example #3 Non-obvious Ternary Behaviour
<?php
// on first glance, the following appears to output 'true'
echo (true?'true':false?'t':'f');

// however, the actual output of the above is 't'
// this is because ternary expressions are evaluated from left to right

// the following is a more obvious version of the same code as above
echo ((true ? 'true' : false) ? 't' : 'f');

// here, you can see that the first expression is evaluated to 'true', which
// in turn evaluates to (bool)true, thus returning the true branch of the
// second ternary expression.
?>