#php #operators
#php #операторы
Вопрос:
Часто, когда я пишу PHP, я создаю условные обозначения, подобные этому:
if(1 === $var1
and 2 === $var2
or 1 == $var3) {
// do something here maybe
}
Я думаю, что это делает их более простыми и естественными для чтения. Я знаю, что это, вероятно, смешно, когда я использую Yodas.
Причина, по которой каждому условию в отдельной строке предшествует and
or or
, заключается в том, что это упрощает комментирование части инструкции при отладке.
Есть ли какой-либо недостаток в этом по сравнению с «обычным» ||
and amp;amp;
?
Комментарии:
1. отдельная строка — это вроде как неплохо. Но какое это имеет отношение к
and
vsamp;amp;
илиor
vs||
?amp;amp;
Оператор имеет более высокий приоритет, чемand
, поэтому их использование не эквивалентно.2. @dnagirl Вы правы, абсолютно никакого отношения к вопросу, просто захотелось объяснить это там.
Ответ №1:
or
и and
не имеют того же приоритета оператора, что ||
и amp;amp;
. Это означает, что в для определенных значений выражений [a]
и [b]
, [a] and [b] != [a] amp;amp; [b]
. Это может привести к неочевидным ошибкам.
Обратите внимание, что одно имеет более высокий приоритет, чем присвоение, в то время как другое — нет. Это тонкое различие, и даже если вы это понимаете, другие разработчики, читающие ваш код, могут не понимать. В результате я лично рекомендую использовать только amp;amp;
и ||
Операторы Ruby в этом отношении похожи на PHP. Джей Филдс опубликовал простой пример разницы.
Комментарии:
1. Может быть, не только, а скорее все вместе? Используйте в парах, будьте последовательны, чтобы избежать тонких, трудноуловимых ошибок, если вы чувствуете необходимость использовать
and
useor
с ним.2. Согласен: лучше выбрать одну пару и придерживаться ее. Смешивание двух или, не дай бог, замена одного другим по эстетическим соображениям — вот где вы попадаете в беду.
3. Интересно отметить, что для
xor
не существует символьного оператора, поэтому в этом случае вам придется использовать именованный оператор. Я используюxor
не так много, но если вы используете, это может повлиять на ваш выбор, какой стиль использовать для обеспечения согласованности.
Ответ №2:
В PHP нет существенной функциональной разницы между and
и amp;amp;
, ни между or
и ||
.
Единственное различие между ними заключается в том, что они рассматриваются как разные операторы и имеют разные позиции в порядке приоритета операторов. Это может оказать большое влияние на результаты сложных операций, если вы пренебрегаете заключением объектов в квадратные скобки.
По этой причине, как правило, хорошей идеей является использование одного или другого стиля операторов и придерживаться его, а не смешивать их в одной базе кода (это также хорошая идея для удобства чтения). Но выбор, какую пару операторов использовать, довольно несущественен.
В остальном, это в основном одно и то же.
Смотрите здесь о приоритете операторов PHP: http://php.net/manual/en/language.operators.precedence.php
(обратите внимание на разные позиции в таблице and
и or
против amp;amp;
и ||
)
Комментарии:
1. Я бы сказал, что разница в приоритете операторов является существенным функциональным различием. Особенно потому, что одно имеет более высокий приоритет, чем присвоение, в то время как другое ниже. Это означает, что
$a = $b and $c
имеет совершенно иное значение, чем$a = $b amp;amp; $c
2. @Frank: Я согласен, что это важно, и я согласен, что важно знать разницу. Я бы не назвал это функционально другим, хотя, потому что автономная функциональность двух операторов идентична. Но я думаю, что это просто лингвистический аргумент; мы в основном согласились, и я дал вашему ответу 1.