#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));