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

Может ли кто-нибудь объяснить, почему это так?

Основы:

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

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

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

  3. Приоритет оператора определяет, в каком порядке части выражения сгруппированы в подвыражения. Операторы с более высоким приоритетом группируются с их операндами перед операторами меньшего приоритета.

Следовательно:

 $e = false || true; 

false || true вычисляется значение true , которое приводит к значению true , которому присваивается значение $e . || оператор имеет более высокий приоритет, чем = , поэтому false || true 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 первоначально имеет значение false, правая часть оценивается и 5 присваивается $foo , что приводит к 5 , что истинно-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; 

здесь он не будет оценивать после или выражение оператора, поэтому выход будет равен $ foo = 1. Теперь выражение

$foo=false or $foo=5;

Здесь он будет оценивать после или как = более высокий приоритет, так что $foo из которого он будет оценивать $foo=5 поэтому выход будет равен 5 Но когда мы оцениваем $foo=false or true здесь он будет считать = более высокий приоритет, поэтому output будет $foo=false но целое выражение будет оцениваться как true, потому что false or true становится false

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

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

Сравните, чем or = имеет высокий приоритет .. Это факт …. 🙂