Я просматривал раздел приоритета операторов php.net и наткнулся на этот пример , в котором написано
$a = 1;
$b = null;
$c = isset($a) && isset($b);
$d = ( isset($a) and isset($b) );
$e = isset($a) and isset($b);
var_dump($a, $b, $c, $d, $e);
//Result:
int(1)
NULL
bool(false)
bool(false) <== I get this
bool(true) <== I do not get this
Я использую довольно много отладочных и многословных операторов вывода (_r)в моем коде, чтобы отслеживать, где я нахожусь в коде.Поэтому я использую $debug and print_r($dataArray)
или $verbose and print "Updating dataArray\n"
как отдельные операторы между кодом, что позволяет мне контролировать эти операторы print (_r).Это происходит из моего опыта BASH, когда я писал много [[ $condition ]] && { #Do if true } || { #Do if false }
.В BASH я знал, что они закорочены, и использовал этот факт для написания множества простых однострочников.
Теперь я наблюдаю, как много этой практики (написания $verbose and print
) медленно проникает в мои if
утверждения.Я знаю, что это НЕ рекомендуемая практика и может укусить меня в назад .Тем не менее, я хочу освоить этот навык, так как мне нравится писать такие лайнеры, и я хочу использовать его как мой личный стиль .
Итак, мой вопрос (-ы):
- Какой оператор (
&&
или and
) имеет короткое замыкание? - В руководстве говорится
&&
имеет приоритет над and
, но кто-то может это проиллюстрировать, смешав функцию / функциональность / характеристику оператора с коротким замыканием с приоритетом оператора.(в основном смешивание и сопоставление приоритета и короткого замыкания)
Пожалуйста, уточните природу операторов как короткого замыкания, так и возвращаемого значения.
PS: 1. Я надеюсь, что ассоциативность этих операторов будет такой же и интуитивно понятной, но если вы знаете какие-то изворотливости, пожалуйста, просветите меня.
PS: 2. Если вы все еще хотите предупредить меня об опасностяхТакая практика, пожалуйста, приведите примеры.
РЕДАКТИРОВАТЬ: После изменения моего простого кода $var = mysql_(...) or die()
путем замены or
на ||
я обнаружил, как раздражает использование операторов ||
и &&
вместо and
иor
. Код просто не работал !Насколько я понимаю, предыдущая конструкция присваивает возвращаемое значение от TRUE
или FALSE
до $var
, что, в свою очередь, последовательно использует $var
для генерации предупреждения / ошибки / неожиданного поведения.Последняя конструкция сначала присваивает результат от mysql_(...)
до $var
, а затем оценивает соединение =
и die
.
Это хороший урок для меня, я лучше 1. Начните использовать PDO / mysqli и handleошибки самостоятельно 2. Подумайте дважды, прежде чем писать что-то, что я назвал выше как личный стиль .
// примечание к себе: не используйте опыт одного языка сценариев / интерпретации при написании кода на другом,каждый из них уникален и имеет свои причуды и подводные камни, и это просто грустно * вздох *