Поведение оператора or в PHP
я пытаюсь понять поведение or
оператора. Пожалуйста, смотрите следующие примеры:
$e = false || true;
var_dump($e);
выход, как ожидалось: bool(true);
$f = false or true;
var_dump($f);
выход, как ожидалось: bool(false)
. Я понял это таким образом, что =
имеет более высокий приоритет, чем Or
, поэтому $f
назначена false
.
но приведенный ниже код работает совершенно противоположно тому, что я думал. Я думал, что $foo
будет назначен 5
а потом сравнил с собой.
Но это $foo
назначается только тогда, когда если $foo
установлено, что означает, что он проверяет, если $foo
присваивается чему-либо раньше, назначьте ему 5.
$foo or $foo = 5;
может кто-нибудь объяснить, почему это так?
4 ответа:
основы:
выражение присваивания приводит к присвоенному значению.
что это значит?
$foo = 'bar'
- это выражение, в котором оператор присваивания=
присваивает значение. Выражение всегда возвращает значение. Так же, как выражение1 + 2
приводит к значению3
, выражение$foo = 'bar'
приводит к значению'bar'
. Вот почему это работает:$foo = $bar = 'baz'; // which is: $foo = ($bar = 'baz');
логические операции есть операции короткого замыкания. Обе стороны не всегда оцениваются, если они не должны быть.
true || false
всегдаtrue
в целом, так как левый операндtrue
, так что все выражение должно бытьtrue
.false
даже не оценивается здесь.приоритет операторов диктует, в каком порядке части выражения сгруппированы в подвыражения. Высшее операторов приоритет сгруппированы с их операндов до нижнего операторы приоритета.
таким образом:
$e = false || true;
false || true
оценивается, что приводит к значениюtrue
, которому присвоен$e
. Элемент||
оператор имеет более высокий приоритет, чем=
, поэтомуfalse || true
группируется в выражение (в отличие от($e = false) || true
).$f = false or true;
здесь
or
есть ниже приоритет, чем=
, что означает операция присваивания группируется в одно выражение передor
. Так что сначала$f = false
вычисляется выражение, результатом которого являетсяfalse
(см. выше). Тогда у вас есть простое выражениеfalse or true
который оценивается далее и приводит кtrue
, но это никого не волнует.оценка работает следующим образом:
1. $f = false or true; 2. ($f = false) or true; // precedence grouping 3. false or true; // evaluation of left side ($f is now false) 4. true; // result
теперь:
$foo or $foo = 5;
здесь
$foo = 5
имеет более высокий приоритет и рассматривается как один выражение. Так как это происходит на правой сторонеor
оператор, выражение вычисляется только при необходимости. Это зависит от того, что$foo
изначально. Если$foo
иtrue
, правая сторона не будет оцениваться вообще, так какtrue or ($foo = 5)
должно бытьtrue
в целом. Если$foo
имеет значение falsey изначально, хотя, правая сторона оценивается и5
назначена$foo
, в результате5
, что является true-ish, что означает, что общее выражениеtrue
, которая никого не волнует.1. $foo or $foo = 5; 2. $foo or ($foo = 5); // precedence grouping 3. false or ($foo = 5); // evaluation of left side 4. false or 5; // evaluation of right side ($foo is now 5) 5. true; // result
согласно php.net веб-страница о логических операторах:
это:
$e = false || true;
действий такой:
$e = (false || true) // If false is true, then $e = false. Otherwise true
это:
$f = false or true;
будет действовать так:
($f = false) or true; // $f = false is true, as the assignment succeeded
это:
$foo or $foo = 5;
будет действовать так:
$foo or ($foo = 5) // foo = undefined or foo = 5, so foo = 5
для последнего неопределенное в основном похоже на false, поэтому foo равно 5.
кроме того, вот ссылка для операторов порядок:http://www.php.net/manual/en/language.operators.precedence.php
обновление:
Ок, теперь давайте перейдем к главному. Например, как мы все знаем при использовании извлеченного запроса:
while($row = @mysql_fetch_assoc($result))
и мы все знаем, пока циклы выполняются только на
true
, поэтому$row = @mysql_fetch_assoc($result)
возвращает true.то же самое с вопросом Дарика.
$foo or $foo = 5;
по сути:
$foo or ($foo = 5);
что в основном:
$foo = undefined or ($foo = 5); // $foo = 5 actually returns true
, который также
$foo = undefined or true;
и как я уже упоминал ранее, undefined = false, поэтому $ foo = 5 (поскольку это истинное утверждение).
Я надеюсь, что все могут понять.
$foo or $foo = 5; Suppose let say $foo=true or $foo=5;
здесь он не будет оценивать после или оператор expresion так что выход будет $foo=1 Теперь выражение
$foo=false or $foo=5;
здесь он будет оценивать после или как = высокий приоритет, так
$foo
С какой из которых он будет оценивать$foo=5
Так что выход будет5
Но когда мы оцениваем$foo=false or true
поэтому здесь он будет рассматривать = более высокий приоритет, поэтому выход будет$foo=false
но все выражение будет оцениваться как истинное, потому чтоfalse or true
будетfalse