Je me souviens avoir lu il y a quelque temps sur les opérateurs logiques qui, dans le cas de OR
, utiliser ||
était mieux que or
(ou vice versa).
Je devais juste l'utiliser dans mon projet quand il m'est revenu, mais je ne me souviens plus quel opérateur était recommandé ou si c'était même vrai.
Quel est le meilleur et pourquoi?
php
operators
logical-operators
or-operator
C'est annoncé
la source
la source
$e = true || $x = 'foo'
ne définira pas en$x
raison d'un court-circuit, pas en raison d'une priorité plus élevée.27 or 0
revient27
pour moi.or
renvoie également un booléen. Juste sa priorité est si faible qu'il semble parfois qu'il fasse autre chose. :)print 27 or 0
imprimerait27
parceor
qu'il arrive aprèsprint 27
. BTW,echo
n'est pas dupe -echo 27 or 0
produirait1
.Ils sont utilisés à des fins différentes et ont en fait des priorités d'opérateurs différentes. Les opérateurs
&&
et||
sont destinés aux conditions booléennes, tandis queand
etor
sont destinés au flux de contrôle.Par exemple, ce qui suit est une condition booléenne:
Cela diffère du flux de contrôle:
la source
die()
La fonction sera appelée sidoSomething()
retournerafalse
ounull
? Et sidoSomething()
revienttrue
ou rien?doSomething()
est évalué comme un booléen. S'il renvoie une valeur que PHP considère comme véridique (true
, une chaîne non vide, etc.), il n'appellera pasdie()
.La différence entre respectivement || et OR et && et AND est la priorité de l'opérateur :
$bool = FALSE || TRUE;
($bool = (FALSE || TRUE))
$bool
estTRUE
$bool = FALSE OR TRUE;
(($bool = FALSE) OR TRUE)
$bool
estFALSE
$bool = TRUE && FALSE;
($bool = (TRUE && FALSE))
$bool
estFALSE
$bool = TRUE AND FALSE;
(($bool = TRUE) AND FALSE)
$bool
estTRUE
la source
Source: http://wallstreetdeveloper.com/php-logical-operators/
Voici un exemple de code pour travailler avec des opérateurs logiques:
la source
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 peut avoir un problème similaire ...
Disons que le code ressemble à ceci:
Vous vous attendez (comme vous en avez l'habitude par exemple avec javascript) que lorsque $ this-> positions () retourne false ou null, $ positions est un tableau vide. Mais ce n'est pas le cas. La valeur est TRUE ou FALSE dépend de ce que renvoie $ this-> positions ().
Si vous avez besoin d'obtenir la valeur de $ this-> positions () ou un tableau vide, vous devez utiliser:
ÉDITER:
L'exemple ci - dessus ne fonctionne pas comme prévu , mais la vérité est que ,
||
etor
n'est pas la même chose ... Essayez ceci:Voici le résultat:
Donc, en fait, la troisième option
?:
est la bonne solution lorsque vous souhaitez définir une valeur renvoyée ou un tableau vide.Testé avec PHP 7.2.1
la source
$positions = $this->positions() ?? [];
est probablement ce que vous voulez.Je ne pense pas que l'un soit fondamentalement meilleur qu'un autre, mais je suggérerais de rester avec || car c'est la valeur par défaut dans la plupart des langues.
EDIT: Comme d'autres l'ont souligné, il y a en effet une différence entre les deux.
la source
Il n'y a rien de mal ou de mieux, cela dépend juste de la priorité des opérateurs. Puisque
||
a une priorité plus élevée queor
,||
est donc principalement utilisé.la source
Certains langages utilisent le court-circuit, et d'autres utilisent une évaluation booléenne complète (si vous le savez, c'est similaire à la directive
$B
en Pascal).Explications:
Dans cet exemple, la fonction
B()
ne sera jamais exécutée. Puisque la fonctionA()
retourne TRUE, le résultat de l'instruction OR est connu de la première partie sans qu'il soit nécessaire d'évaluer la deuxième partie de l'expression.Cependant avec
( A() || B() )
, la seconde partie est toujours évaluée quelle que soit la valeur de la première.Pour une programmation optimisée, vous devez toujours utiliser
OR
ce qui est le plus rapide (sauf dans le cas où la première partie revientfalse
et la seconde partie doit en fait être évaluée).la source
||
,B
ne sera pas appelé. Les deux opérateurs font exactement la même chose, sauf que la priorité est différente.