Я пытаюсь понять поведение 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;
Может ли кто-нибудь объяснить, почему это так?
Основы:
Выражение присваивания приводит к присвоенному значению.
Что это значит? $foo = 'bar'
– это выражение, в котором оператор присваивания =
присваивает значение. Выражение всегда возвращает само значение. Так же, как выражение 1 + 2
приводит к значению 3
, выражение $foo = 'bar'
приводит к значению 'bar'
. Вот почему это работает:
$foo = $bar = 'baz'; // which is: $foo = ($bar = 'baz');
Булевы операции являются короткозамкнутыми операциями. Обе стороны не всегда оцениваются, если им это не нужно. true || false
true || false
всегда true
целом, так как левый операнд true
, поэтому все выражение должно быть true
. false
здесь даже не оценивается.
Приоритет оператора определяет, в каком порядке части выражения сгруппированы в подвыражения. Операторы с более высоким приоритетом группируются с их операндами перед операторами меньшего приоритета.
Следовательно:
$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
=
имеет высокий приоритет .. Это факт …. 🙂