2015-07-03 5 views
3
$i = 2; 
$result = ($i == 2) ? "Two" : ($i == 1) ? "One" : "Other"; 

echo $result; // outputs: One 

В то время как тот же самый код в выходах C#: ДваПочему PHP дает неожиданный результат?

int i=2; 
String result = (i == 2) ? "Two" : (i == 1) ? "One" : "Other" ; 
Console.Write(result); // outputs: Two 
+3

Это не неожиданно, это просто неинтуитивно ... именно поэтому рекомендации по рекомендациям против тройки вложенности: 'Примечание: Рекомендуется избегать тройных выражений. Поведение PHP при использовании более одного тернарного оператора в одном выражении неочевидно. –

+1

У вас нет сердца для вашего компилятора. Укладка тройников ... –

ответ

5

Тройные операторы оценивали ЛЕВЫЙ-направо.

($i == 2) ? "Two" : ($i == 1) ? "One" : "Other" 
"Two" ? "One" : "Other" // first part evaluated to "Two" 
"One"     // non-empty strings evaluate to true 

Таким образом, вы должны получить One в вашем выводе, не Other. Это немного сложно.

Мудрые слова из manual:

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

+0

Вы правы. Я исправил свой вопрос – Ahmad

2

Объяснение уже предусмотрено @light, но, чтобы получить результат, который вы хотите вам нужны дополнительные скобки:

$i = 3; 
$result = ($i == 2) ? "Two" : (($i == 1) ? "One" : "Other"); 
echo $result, PHP_EOL; 

$i = 2; 
$result = ($i == 2) ? "Two" : (($i == 1) ? "One" : "Other"); 
echo $result, PHP_EOL; 

$i = 1; 
$result = ($i == 2) ? "Two" : (($i == 1) ? "One" : "Other"); 
echo $result, PHP_EOL; 

Demo

0

Это потому, что C# сильно типизированных и требует boolean value является первым аргументом тройного оператора, тогда как PHP свободно набирается, и в основном каждое значение может быть преобразовано в его логический эквивалент. Кроме того, троичные операторы оцениваются слева направо. Что это значит?

В C# мы должны булева на самой левой стороне оператора, так это выражение:

String result = (i == 2) ? "Two" : (i == 1) ? "One" : "Other" ; 

будут оценены в следующем порядке:

String result = (i == 2) ? "Two" : ((i == 1) ? "One" : "Other"); 

i==2 равно true так "Two" будет назначен в качестве конечного результата. В PHP это выглядит немного иначе. Мы можем интерпретировать это выражение:

$result = ($i == 2) ? "Two" : ($i == 1) ? "One" : "Other"; 

как этот

$result = (($i == 2) ? "Two" : ($i == 1)) ? "One" : "Other"; 

$i равно 2, поэтому дорожим "Two" будет результатом первого выражения. Непустые значения строк на PHP равны true, поэтому «One» будет конечным результатом.

Смежные вопросы