#php #puzzle #ternary-operator
#php #Головоломка #тернарный оператор
Вопрос:
Почему он не печатает то, что предполагается для печати?
<?php
$place = 1;
echo $place === 1 ? 'a' : $place === 2 ? 'b' : 'c';
?>
Комментарии:
1. Я ничего не вижу напечатанного 😕
2. из руководства «Рекомендуется избегать «укладки» троичных выражений. Поведение PHP при использовании более одного троичного оператора в одном операторе неочевидно: » php.net/manual/en/language.operators.comparison.php
3. @Karthik: потому
$place !== 1
что?? И какой случай$place
на самом деле был=== 1
бы тогда, если не в этом случае?
Ответ №1:
Руководство — ваш друг. Цитата:
<?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.
Вы в основном делаете:
echo ($place === 1 ? 'a' : $place === 2) ? 'b' : 'c';
// which is
echo 'a' ? 'b' : 'c';
// which is
echo 'b';
Комментарии:
1. Я запутался с этой линией <?php echo ‘a’ ? ‘b’: ‘c’; ?> я имею в виду, что он проверил, что a пусто?? или что-то еще??
2. @MBTheDeveloper PHP слабо типизирован и выполняет множество манипуляций с типами. В PHP
'a' == true
(потому'a'
что это непустая, ненулевая строка)3. спасибо, я просто запутался с его 2-м условием, но теперь понимаю, почему это правда.
Ответ №2:
echo ($place === 1 ? 'a' : $place === 2) ? 'b' : 'c';
echo ('a') ? 'b' : 'c';
echo (true) ? 'b' : 'c';
echo 'b';
Вот почему.
Ответ №3:
Условный оператор вычисляет слева направо, поэтому вы должны написать
echo ($place === 1 ? 'a' : $place === 2) ? 'b' : 'c';
echo (true ? 'a' : $place === 2) ? 'b' : 'c';
echo 'a' ? 'b' : 'c';
echo true ? 'b' : 'c'; // outputs b
чтобы уточнить. Это поведение хорошо документировано.
Ответ №4:
Как вы думаете, что он должен печатать и почему, и что печатается?
Кроме того, из руководства по PHP по троичным выражениям:
Примечание:
Рекомендуется избегать «укладки» троичных выражений. Поведение 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.
?>