Синтаксическая ошибка тернарного оператора PHP

#php #scripting

#php #сценарии

Вопрос:

 <?
$percent = 105;
$percent = ($percent > 100) ? 100 :
           ($percent < 0) ? 0 : $percent;
echo $percent;
?>
  

Почему это эхо 0? Я просматриваю написанный мной код JavaScript, который работает, и не нахожу разницы в логике.

Ответ №1:

В PHP, в отличие от JS и многих других языков, тернарный оператор является левоассоциативным. Это означает, что ваше выражение эквивалентно

 $percent = (($percent > 100) ? 100 : ($percent < 0)) ? 0 : $percent;
  

И поскольку ($percent > 100) ? 100 : ($percent < 0) в этом случае значение равно 100, это как если бы вы написали

 $percent = 100 ? 0 : $percent;
  

Что, очевидно, приводит к нулю.

Предложение: Никогда не пишите сложные выражения без круглых скобок. Размещение скобок в соответствующих местах заставило бы код работать как на JS, так и на PHP, и, возможно, также облегчило бы его чтение. В том же духе я пообещал себе никогда не использовать более одной тернарной функции в одном выражении. Возможно, вы захотите сделать то же самое.

Комментарии:

1. Ах, вот ты где. Спасибо тебе, Джон Сноу! Примет это, когда блокировка будет снята.

2. Прочитайте PHP: фрактал плохого дизайна и откройте для себя еще много подобных жемчужин.

Ответ №2:

Ваш код выводит 0 из-за приоритетов оператора.

Этот работает нормально:

 <?php
$percent = 105;
$percent = ($percent > 100) ? 100 : (($percent < 0) ? 0 : $percent);
echo $percent;
  

Ответ №3:

это то, что вы хотите:

 $percent = ($percent > 100 ? 100 : ($percent < 0 ? 0 : $percent));
  

Или, может быть, немного проще, вот так:

 $percent = min(100, max(0, $percent));