Поведение оператора or в 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имеет значение falsey изначально, хотя, правая сторона оценивается и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
согласно 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;здесь он не будет оценивать после или оператор expresion так что выход будет $foo=1 Теперь выражение
$foo=false or $foo=5;здесь он будет оценивать после или как = высокий приоритет, так
$fooС какой из которых он будет оценивать$foo=5Так что выход будет5Но когда мы оцениваем$foo=false or trueпоэтому здесь он будет рассматривать = более высокий приоритет, поэтому выход будет$foo=falseно все выражение будет оцениваться как истинное, потому чтоfalse or trueбудетfalse