Разница между "&&" и "and": приоритет оператора и короткое замыкание - PullRequest
6 голосов
/ 08 августа 2011

Я просматривал раздел приоритета операторов 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 утверждения.Я знаю, что это НЕ рекомендуемая практика и может укусить меня в назад .Тем не менее, я хочу освоить этот навык, так как мне нравится писать такие лайнеры, и я хочу использовать его как мой личный стиль .

Итак, мой вопрос (-ы):

  1. Какой оператор (&& или and) имеет короткое замыкание?
  2. В руководстве говорится&& имеет приоритет над and, но кто-то может это проиллюстрировать, смешав функцию / функциональность / характеристику оператора с коротким замыканием с приоритетом оператора.(в основном смешивание и сопоставление приоритета и короткого замыкания)

Пожалуйста, уточните природу операторов как короткого замыкания, так и возвращаемого значения.

PS: 1. Я надеюсь, что ассоциативность этих операторов будет такой же и интуитивно понятной, но если вы знаете какие-то изворотливости, пожалуйста, просветите меня.
PS: 2. Если вы все еще хотите предупредить меня об опасностяхТакая практика, пожалуйста, приведите примеры.

РЕДАКТИРОВАТЬ: После изменения моего простого кода $var = mysql_(...) or die() путем замены or на || я обнаружил, как раздражает использование операторов || и && вместо and иor. Код просто не работал !Насколько я понимаю, предыдущая конструкция присваивает возвращаемое значение от TRUE или FALSE до $var, что, в свою очередь, последовательно использует $var для генерации предупреждения / ошибки / неожиданного поведения.Последняя конструкция сначала присваивает результат от mysql_(...) до $var, а затем оценивает соединение = и die.
Это хороший урок для меня, я лучше 1. Начните использовать PDO / mysqli и handleошибки самостоятельно 2. Подумайте дважды, прежде чем писать что-то, что я назвал выше как личный стиль .
// примечание к себе: не используйте опыт одного языка сценариев / интерпретации при написании кода на другом,каждый из них уникален и имеет свои причуды и подводные камни, и это просто грустно * вздох *

1 Ответ

7 голосов
/ 08 августа 2011

код

$e = isset($a) and isset($b);

анализируется так же, как

($e = isset($a)) and isset($b);

Следовательно, $e, как определено isset($a) и присвоением, равно true - независимо от оценки isset($b).

...