48 votes

Le comportement de l’opérateur en PHP ou

J'essaie de comprendre le comportement de l' or de l'opérateur. Veuillez voir les exemples ci-dessous:

$e = false || true;
var_dump($e);

La sortie est prévu: bool(true);

$f = false or true;
var_dump($f);

La sortie est prévu: bool(false). J'ai compris cela dans une manière que l' = a une priorité plus élevée que l' Or, c'est pourquoi l' $f est attribué à l' false.

Mais le code ci-dessous fonctionne tout à fait à l'opposé de ce que je pensais. Je pensais que l' $foo sera attribuée 5 , puis de les comparer à lui-même. Mais l' $foo devient attribué que si l' $foo est de définir ce qui signifie qu'il est en train de vérifier si l' $foo est attribué à quoi que ce soit avant, attribuer 5.

$foo or $foo = 5; 

Quelqu'un peut-il expliquer pourquoi il en est ainsi?

50voto

deceze Points 200115

Les principes de base:

  1. Une expression d'affectation des résultats à la valeur assignée.

    Qu'est-ce que cela signifie? $foo = 'bar' est une expression, dans lequel l'opérateur d'assignation = assigne une valeur. L'expression renvoie toujours la valeur elle-même. Tout comme l'expression 1 + 2 les résultats dans la valeur 3, l'expression $foo = 'bar' les résultats dans la valeur 'bar'. C'est pourquoi cela fonctionne:

    $foo = $bar = 'baz'; // which is: $foo = ($bar = 'baz');
    
  2. Les opérations booléennes sont de court-circuit des opérations. Les deux côtés ne sont pas toujours évaluées si elles n'ont pas besoin de l'être. true || false toujours true dans l'ensemble, depuis l'opérande de gauche est - true, donc l'ensemble de l'expression doit être true. false n'est même pas évalué ici.

  3. La priorité de l'opérateur dicte l'ordre dans lequel les parties d'une expression sont regroupés dans des sous-expressions. La priorité des opérateurs sont regroupés avec leurs opérandes avant de baisser la priorité des opérateurs.

Donc:

$e = false || true;

false || true est en cours d'évaluation, dont les résultats dans la valeur true, qui est affecté $e. L' || opérateur a une priorité plus forte que l' =donc false || true sont regroupés en une expression (par opposition à l' ($e = false) || true).

$f = false or true;

Ici, maintenant, or a une plus faible priorité supérieure à =, ce qui signifie que l'opération d'affectation est regroupées en une seule expression avant de l' or. Donc, la première $f = false expression est évaluée, dont le résultat est false (voir ci-dessus). Alors vous avez la simple expression false or true qui est évalué suivant et résultats en true, mais dont personne ne se soucie.

L'évaluation fonctionne comme ceci:

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

Maintenant:

$foo or $foo = 5; 

Ici, de nouveau, $foo = 5 a une priorité plus élevée et est traitée comme une seule expression. Depuis, il se produit sur le côté droit de l' or de l'opérateur, l'expression n'est évaluée que si nécessaire. Cela dépend de ce que l' $foo initialement. Si $foo est true, la droite ne sera pas évalué à tous, depuis true or ($foo = 5) doit true dans l'ensemble. Si $foo a un falsey valeur initialement bien, le côté droit est évalué et, 5 est attribué à l' $foo, ce qui résulte en 5, ce qui est vrai-ish, ce qui signifie que l'expression globale est - true, dont personne ne se soucie.

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

20voto

think123 Points 5168

Comme par le php.net page web sur les Opérateurs Logiques:

Ce:

$e = false || true;

Des actes comme cela:

$e = (false || true) // If false is true, then $e = false. Otherwise true

Ce:

$f = false or true;

Agir comme ceci:

($f = false) or true; // $f = false is true, as the assignment succeeded

Ce:

$foo or $foo = 5; 

Agir comme ceci:

$foo or ($foo = 5) // foo = undefined or foo = 5, so foo = 5

Pour la dernière, undefined est fondamentalement comme faux, donc foo est égal à 5.

Aussi, voici le lien pour l'opérateur ordre de priorité: http://www.php.net/manual/en/language.operators.precedence.php

Mise à JOUR:

Ok, maintenant, passons à l'essentiel. Comme la façon dont nous le savons tous lors de l'utilisation d'un extraites de la requête:

while($row = @mysql_fetch_assoc($result))

Et nous savons tous que les boucles while exécuter uniquement sur truedonc $row = @mysql_fetch_assoc($result) renvoie la valeur true.

Même avec Daric de la question.

$foo or $foo = 5;

C'est en gros:

$foo or ($foo = 5);

Ce qui est fondamentalement:

$foo = undefined or ($foo = 5); // $foo = 5 actually returns true

Ce qui est également

$foo = undefined or true;

Et comme je l'ai mentionné précédemment, undefined = false, donc $foo = 5 (comme c'est le vrai déclaration).

J'espère que tout le monde peut comprendre.

3voto

Arpit Srivastava Points 1098
$foo or $foo = 5;

Suppose let say $foo=true or $foo=5;

ici, il n'évaluera pas après ou l'exploitant de l'expresion donc de sortie sera de $foo=1 Maintenant, l'expression est

$foo=false or $foo=5;

Ici, il permettra d'évaluer après ou = priorité plus élevée, de sorte $foo de qui de qui il évaluera $foo=5donc la sortie sera 5 Mais lorsque nous évaluons $foo=false or true donc, ici, il examinera = priorité plus élevée de sorte que la sortie sera $foo=false mais l'ensemble de l'expression évaluera comme vrai, car false or true devient false

2voto

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

Cochez cette case pour pouvoir affecter la valeur "5" à $foo .

Comparez que or = a une priorité élevée .. C'est le fait .... :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X