Необычная рабочая операция
-
27-09-2019 - |
Вопрос
Меня попросили выполнить эту операцию Темнарного оператора:
$test='one';
echo $test == 'one' ? 'one' : $test == 'two' ? 'two' : 'three';
Которые печатают два (проверено с использованием PHP).
Я до сих пор не уверен в логике для этого. Пожалуйста, кто-нибудь может сказать мне логику для этого.
Решение
Ну, то? и: иметь равный приоритет, поэтому PHP будет разобраться влево на правую оценку каждого бита в свою очередь:
echo ($test == 'one' ? 'one' : $test == 'two') ? 'two' : 'three';
Первый $test == 'one'
Возвращает true, поэтому первые друзья имеют значение «один». Теперь второй тройник оценивается так:
'one' /*returned by first ternary*/ ? 'two' : 'three'
«One» верно (непустая строка), поэтому «два» является конечным результатом.
Другие советы
В основном интерпретатор оценивает это выражение слева направо, поэтому:
echo $test == 'one' ? 'one' : $test == 'two' ? 'two' : 'three';
интерпретируется как
echo ($test == 'one' ? 'one' : $test == 'two') ? 'two' : 'three';
И выражение в Paratheses оценивает true, поскольку как «One», так и «два» не являются NULL / O / другим формой false. Так что если это будет выглядеть так:
echo $test == 'one' ? FALSE : $test == 'two' ? 'two' : 'three';
Это будет печатать три. Чтобы сделать его работать хорошо, вы должны забыть о комбинировании тройных операторов и использовать регулярный IFS / переключатель для более сложной логики или, по крайней мере, используйте кронштейны, для интерпретатора, чтобы понять вашу логику, и не выполнять проверку стандартных LTR:
echo $test == 'one' ? 'one' : ($test == 'two' ? 'two' : ($test == 'three' ? 'three' : 'four'));
//etc... It's not the most understandable code...
//You better use:
if($test == 'one')
echo 'one';
else { //or elseif()
...
}
//Or:
switch($test) {
case 'one':
echo 'one';
break;
case 'two':
echo 'two';
break;
//and so on...
}
Это работает правильно, когда вы используете кронштейны:
<?
$test='one';
echo $test == 'one' ? 'one' : ($test == 'two' ? 'two' : 'three');
Я не понимаю его на 100%, но без скобок, к переводчику, утверждение должно выглядеть так:
echo ($test == 'one' ? 'one' : $test == 'two') ? 'two' : 'three';
Результат первого состояния, по-видимому, возвращается в результате всей тройной операции.
Я думаю, что это оценивается так:
echo ($test == 'one' ? 'one' : $test == 'two') ? 'two' : 'three';
($ test == 'One'? 'One': $ test == «два») не нулевой / NULL, поэтому «два» является логическим выходом
Если вы хотите, чтобы это было правильно работать, напишите:
echo $test == 'one' ? 'one' : ($test == 'two' ? 'two' : 'three');
PHP's. документация говорит:
Примечание: Рекомендуется вам Избегайте «укладки» тройных выражений. Отказ Поведение PHP при использовании более одного тройного оператора в одном операторе не очевидно:
Пример № 3 неочевидное тройное поведение
<?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. ?>
Если вы поставьте скобки вокруг ложного оператора, он печатает one
:
echo $test == 'one' ? 'one' : ($test == 'two' ? 'two' : 'three');
Торговые операторы выполняются в порядке появления, поэтому у вас действительно есть:
echo ($test == 'one' ? 'one' : $test == 'two') ? 'two' : 'three';
Вложенные тройные операции брутто! Вышеуказанное объяснение показывает, почему.
В основном это логика:
is $test == 'one'
if TRUE then echo 'one'
else is $test == 'two'
if TRUE then echo 'two'
else echo three