<?php echo true?'what':true?'will':'print?';?>
Выше кодовых выходов will
,
Я не могу понять логику. Может кто-нибудь объяснить это.
Заранее спасибо.
От документация:
Замечания:
Рекомендуется избегать «укладки» троичных выражений. Поведение PHP при использовании более одного тернарного оператора в одном выражении не очевидно:
Пример №4 Неочевидное троичное поведение
// однако, фактический результат вышеупомянутого ‘t’
// это потому, что троичные выражения оцениваются слева направо// ниже приведена более очевидная версия того же кода, что и выше
echo ((true? ‘true’: false)? ‘t’: ‘f’);// здесь вы можете видеть, что первое выражение оценивается как ‘true’, что
// в свою очередь оценивается как (bool) true, возвращая истинную ветвь
// второе троичное выражение.
Вы должны работать с фигурными скобками:
echo true?'what':(true?'will':'print?');
это будет выводить what
, Второе, если переопределяет первое, если нет фигурных скобок. Потому что троичные выражения интерпретируются слева направо. Поэтому без каких-либо установленных вами скобок интерпретатор PHP будет интерпретировать ваше утверждение как:
echo (true?'what':true)?'will':'print?';
По данным PHP.net вам следует избегать суммирования троичных выражений:
Рекомендуется избегать «укладки» троичных выражений. Поведение PHP при использовании более одного тернарного оператора в одном выражении не очевидно:
Рекомендуется избегать «укладки» троичных выражений. Поведение 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.
`
Тернарный оператор в PHP является левоассоциативным. Ваш код оценивается так:
echo (true ? 'what' : true) ? 'will' : 'print?';
Это эквивалентно:
echo (true) ? 'will' : 'print?';
И, таким образом, результатом является «воля». Вы должны использовать следующее:
echo true ? 'what' : (true ? 'will' : 'print?');
Соответствующий пост можно найти здесь: Почему вывод `echo верен? ‘правда ? ‘b’: ‘c’; `’b’?