Здесь есть некоторые шутливые и вводящие в заблуждение комментарии, даже частично неверная информация в ответах. Я хотел бы попытаться улучшить их:
Сначала , как некоторые отмечали, в вашем коде есть ошибка, связанная с вопросом:
if ($status = 'clear' AND $pRent == 0)
должно быть (обратите внимание на ==
вместо =
в первой части):
if ($status == 'clear' AND $pRent == 0)
который в этом случае функционально эквивалентен
if ($status == 'clear' && $pRent == 0)
Второй , обратите внимание, что эти операторы (and or && ||
) являются операторами короткого замыкания. Это означает, что если ответ может быть определен с уверенностью из первого выражения, второе никогда не будет оценено. Опять же, это не имеет значения для вашей отлаженной строки выше, но это чрезвычайно важно, когда вы объединяете эти операторы с присваиваниями, потому что
Третий , реальная разница между and or
и && ||
- их приоритет оператора . В частности, важно, чтобы && ||
имел более высокий приоритет, чем операторы присваивания (= += -= *= **= /= .= %= &= |= ^= <<= >>=
), в то время как and or
имеет более низкий приоритет, чем операторы присваивания. Таким образом, в утверждении, сочетающем использование присваивания и логической оценки, имеет значение, какое вы выберете.
Модифицированные примеры со страницы PHP по логическим операторам :
$e = false || true;
оценивается как true
и присваивает это значение $e
, потому что ||
имеет более высокий приоритет оператора, чем =
, и, следовательно, по существу, оценивается так:
$e = (false || true);
однако
$e = false or true;
назначит false
на $e
(а затем выполнит операцию or
и оценит true
), потому что =
имеет более высокий приоритет оператора, чем or
, по существу, оценивая так:
($e = false) or true;
Тот факт, что эта двусмысленность даже существует, заставляет многих программистов просто использовать && ||
, и тогда все работает четко, как и следовало ожидать в языке, подобном C, т.е. Сначала логические операции, затем присваивание.
Некоторые языки, такие как Perl, часто используют этот вид конструкции в формате, подобном следующему:
$connection = database_connect($parameters) or die("Unable to connect to DB.");
Теоретически это присвоит соединение с базой данных $connection
, или, если это не удастся (и мы предполагаем, что здесь функция вернет что-то, равное false
в этом случае), скрипт завершит работу с ошибкой сообщение. Из-за короткого замыкания, если соединение с базой данных успешно, die()
никогда не оценивается.
Некоторые языки, которые допускают эту конструкцию, запрещают присваивания в условных / логических выражениях (например, Python) для удаления двусмысленности наоборот.
PHP разрешил и то и другое, так что вам просто нужно один раз узнать о ваших двух вариантах, а затем написать код, который вам нравится, но, надеюсь, вы будете последовательны так или иначе.
Если есть сомнения, просто добавьте лишнюю скобку, которая устраняет всю двусмысленность. Они всегда будут одинаковыми:
$e = (false || true);
$e = (false or true);
Вооружившись всеми этими знаниями, я предпочитаю использовать and or
, потому что чувствую, что это делает код более читабельным. У меня просто есть правило не сочетать назначения с логическими оценками. Но на этом этапе это просто предпочтение, и последовательность здесь имеет гораздо большее значение, чем то, какую сторону вы выберете.