Поведение оператора или в 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
изначально имеет значение фальси, правая часть оценивается и 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
=
имеет высокий приоритет.. Это факт....:)