Поведение оператора или в 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');
    
  • Булевы операции являются операциями короткого замыкания. Обе стороны не всегда оцениваются, если им это не нужно. 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 имеет значение false, но правая часть оценивается и 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

Ответ 2

Как на веб-странице 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

Для последнего undefined в основном похож на false, поэтому foo равно 5.

Также здесь ссылка для порядка приоритета оператора: http://www.php.net/manual/en/language.operators.precedence.php

UPDATE:

Хорошо, теперь давайте перейдем к главному. Как мы все знаем, когда вы используете запрошенный запрос:

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 (так как это истинный оператор).

Я надеюсь, что каждый может понять.

Ответ 3

$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

Ответ 4

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

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

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