Поведение оператора 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 52

4 ответа:

основы:

  1. выражение присваивания приводит к присвоенному значению.

    что это значит? $foo = 'bar' - это выражение, в котором оператор присваивания = присваивает значение. Выражение всегда возвращает значение. Так же, как выражение 1 + 2 приводит к значению 3, выражение $foo = 'bar' приводит к значению 'bar'. Вот почему это работает:

    $foo = $bar = 'baz'; // which is: $foo = ($bar = 'baz');
    
  2. логические операции есть операции короткого замыкания. Обе стороны не всегда оцениваются, если они не должны быть. true || false всегда true в целом, так как левый операнд true, так что все выражение должно быть true. false даже не оценивается здесь.

  3. приоритет операторов диктует, в каком порядке части выражения сгруппированы в подвыражения. Высшее операторов приоритет сгруппированы с их операндов до нижнего операторы приоритета.

таким образом:

$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

<?php
$foo = false;
$foo or ($foo = '5');
echo $foo;
?>

проверьте это вы можете присвоить значение " 5 " для $foo.

сравнения or= имеет высокий приоритет.. Вот в чем дело.... :)