Как оценивается следующий скрипт?

<?php echo true?'what':true?'will':'print?';?>

Выше кодовых выходов will,
Я не могу понять логику. Может кто-нибудь объяснить это.

Заранее спасибо.

2

Решение

От документация:

Замечания:

Рекомендуется избегать «укладки» троичных выражений. Поведение PHP при использовании более одного тернарного оператора в одном выражении не очевидно:

Пример №4 Неочевидное троичное поведение

// однако, фактический результат вышеупомянутого ‘t’
// это потому, что троичные выражения оцениваются слева направо

// ниже приведена более очевидная версия того же кода, что и выше
echo ((true? ‘true’: false)? ‘t’: ‘f’);

// здесь вы можете видеть, что первое выражение оценивается как ‘true’, что
// в свою очередь оценивается как (bool) true, возвращая истинную ветвь
// второе троичное выражение.

2

Другие решения

Вы должны работать с фигурными скобками:

echo true?'what':(true?'will':'print?');

это будет выводить what, Второе, если переопределяет первое, если нет фигурных скобок. Потому что троичные выражения интерпретируются слева направо. Поэтому без каких-либо установленных вами скобок интерпретатор PHP будет интерпретировать ваше утверждение как:

echo (true?'what':true)?'will':'print?';

По данным PHP.net вам следует избегать суммирования троичных выражений:

Рекомендуется избегать «укладки» троичных выражений. Поведение PHP при использовании более одного тернарного оператора в одном выражении не очевидно:

2

Рекомендуется избегать «укладки» троичных выражений. Поведение 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.

`

1

Тернарный оператор в PHP является левоассоциативным. Ваш код оценивается так:

echo (true ? 'what' : true) ? 'will' : 'print?';

Это эквивалентно:

echo (true) ? 'will' : 'print?';

И, таким образом, результатом является «воля». Вы должны использовать следующее:

echo true ? 'what' : (true ? 'will' : 'print?');

Соответствующий пост можно найти здесь: Почему вывод `echo верен? ‘правда ? ‘b’: ‘c’; `’b’?

1
По вопросам рекламы [email protected]