Это потому, что 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» будет конечным результатом.
Это не неожиданно, это просто неинтуитивно ... именно поэтому рекомендации по рекомендациям против тройки вложенности: 'Примечание: Рекомендуется избегать тройных выражений. Поведение PHP при использовании более одного тернарного оператора в одном выражении неочевидно. –
У вас нет сердца для вашего компилятора. Укладка тройников ... –