Почему эта печать 2?
echo true ? 1 : true ? 2 : 3;
По моему мнению, он должен печатать 1.
Почему он работает не так, как ожидалось?
Потому что то, что вы написали, такое же, как:
echo (true ? 1 : true) ? 2 : 3;
и, как вы знаете, 1 оценивается как true
.
Что вы ожидаете:
echo (true) ? 1 : (true ? 2 : 3);
Поэтому всегда используйте брекеты, чтобы избежать таких путаниц.
Как уже было сказано, тернарные выражения остаются ассоциативными в PHP. Это означает, что сначала будет выполнен первый слева , затем второй и так далее.
Разделите вторую тройную статью с круглыми скобками.
echo true ? 1 : (true ? 2 : 3);
При возникновении сомнений используйте круглые скобки.
Тернарный оператор в PHP лево-ассоциативный, в отличие от других языков, и работает не так, как ожидалось.
из документов
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. ?>