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

Решение

Основы:

  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 изначально имеет значение фальси, правая часть оценивается и 5 назначен на $fooчто приводит к 5, который является истинным, что означает, что общее выражение 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

В последнем случае undefined в основном похож на 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) возвращает истину.

То же самое с вопросом Дарика.

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

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

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

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

Другие вопросы по тегам