web-dev-qa-db-fra.com

Opérateurs logiques, || ou ou?

Je me souviens avoir lu quelque temps en ce qui concerne les opérateurs logiques que dans le cas de OR, en utilisant || était meilleur que or (ou vice versa).

Je devais juste utiliser cela dans mon projet quand il me revenait, mais je ne me souviens plus quel opérateur était recommandé ni même si c'était vrai.

Quel est le meilleur et pourquoi?

95
drpcken

Il n'y a pas de "meilleur" mais le plus commun est ||. Ils ont une précédence différente et || fonctionnerait comme on pourrait s'y attendre normalement.

Voir aussi: Opérateurs logiques ( l'exemple suivant est tiré de là):

// The result of the expression (false || true) is assigned to $e
// Acts like: ($e = (false || true))
$e = false || true;

// The constant false is assigned to $f and then true is ignored
// Acts like: (($f = false) or true)
$f = false or true;
129
Felix Kling

Ils sont utilisés à des fins différentes et ont en fait des priorités différentes pour les opérateurs. Les opérateurs && Et || Sont destinés aux conditions booléennes, alors que and et or sont destinés au contrôle.

Par exemple, voici une condition booléenne:

if ($foo == $bar && $baz != $quxx) {

Ceci diffère du flux de contrôle:

doSomething() or die();
40
Matthew Ratzloff

La différence entre respectivement || et OR et && et AND est priorité des opérateurs) :

$bool = FALSE || TRUE;

  • interprété comme ($bool = (FALSE || TRUE))
  • valeur de $bool est TRUE

$bool = FALSE OR TRUE;

  • interprété comme (($bool = FALSE) OR TRUE)
  • valeur de $bool est FALSE

$bool = TRUE && FALSE;

  • interprété comme ($bool = (TRUE && FALSE))
  • valeur de $bool est FALSE

$bool = TRUE AND FALSE;

  • interprété comme (($bool = TRUE) AND FALSE)
  • valeur de $bool est TRUE
18
John Slegers

Source: http://bit.ly/1hxDmVR

Voici un exemple de code pour travailler avec des opérateurs logiques:

<html>

<head>
<title>Logical</title>
</head>
<body>
<?php
$a=10;
$b=20;
if($a>$b)
{
    echo " A is Greater";
}
elseif($a<$b)
{
    echo " A is lesser";
}
else
{
     echo "A and B are equal";
}
?>
<?php
    $c=30;
    $d=40;
   //if(($a<$c)AND($b<$d))
   if(($a<$c)&&($b<$d))
   {
       echo "A and B are larger";
   }
   if(isset($d))
       $d=100;
   echo $d;
   unset($d);
?>
<?php
    $var1=2;
    switch($var1)
    {
        case 1:echo "var1 is 1";
               break;
        case 2:echo "var1 is 2";
               break;
        case 3:echo "var1 is 3";
               break;
        default:echo "var1 is unknown";
    }
?>
</body>
</html>
5
improgrammer

Je sais que c'est un vieux sujet mais quand même. Je viens de rencontrer le problème dans le code que je débogue au travail et peut-être que quelqu'un a le même problème ...

Disons que le code ressemble à ceci:

$positions = $this->positions() || [];

Vous vous attendriez (comme vous êtes habitué par exemple à javascript) que lorsque $ this-> positions () renvoie false ou null, $ positions est un tableau vide. Mais ça ne l'est pas. La valeur est TRUE ou FALSE dépend de ce que $ this-> positions () retourne.

Si vous devez obtenir la valeur de $ this-> positions () ou un tableau vide, vous devez utiliser:

$positions = $this->positions() or [];

EDIT:

L'exemple ci-dessus ne fonctionne pas comme prévu, mais la vérité est que || et or n'est pas la même ... Essayez ceci:

<?php

function returnEmpty()
{
  //return "string";
  //return [1];
  return null;
}

$first = returnEmpty() || [];
$second = returnEmpty() or [];
$third = returnEmpty() ?: [];

var_dump($first);
var_dump($second);
var_dump($third);
echo "\n";

Voici le résultat:

bool(false)
NULL
array(0) {
}

Donc, en fait, la troisième option ?: est la solution correcte lorsque vous souhaitez définir une valeur renvoyée ou un tableau vide.

$positions = $this->positions() ?: [];

Testé avec PHP 7.2.1

1
Zdeněk

Il n'y a rien de mauvais ou de meilleur, cela dépend simplement de la priorité des opérateurs. Puisque || a une priorité supérieure à or, donc || est principalement utilisé.

0
Nishu Tayal

Je ne pense pas que l'un soit intrinsèquement meilleur qu'un autre, mais je suggérerais de rester avec || parce que c'est la valeur par défaut dans la plupart des langues.

EDIT: Comme d’autres l’ont souligné, il existe effectivement une différence entre les deux.

0
exahex