Différence entre "! ==" et "==!" [fermé]

162

Hier, je suis tombé sur cela lorsque j'ai modifié le code PHP écrit par quelqu'un d'autre. J'ai été déconcerté qu'une simple comparaison ( if ($var ==! " ")) ne fonctionne pas comme prévu. Après quelques tests, je me suis rendu compte que celui qui écrivait ce code l'utilisait à la ==!place !==comme opérateur de comparaison. Je n'ai jamais vu ==!dans aucune langue, alors je me suis demandé comment diable ce code pouvait même fonctionner et j'ai fait quelques tests:

<?php
echo "int\n";
echo "1 !== 0: "; var_dump(1 !== 0);
echo "1 !== 1: "; var_dump(1 !== 1);
echo "1 ==! 0: "; var_dump(1 ==! 0);
echo "1 ==! 1: "; var_dump(1 ==! 1);
echo "bool\n";
echo "true !== false: "; var_dump(true !== false);
echo "true !== true: "; var_dump(true !== true);
echo "true ==! false: "; var_dump(true ==! false);
echo "true ==! true: "; var_dump(true ==! true);
echo "string\n";
echo '"a" !== " ": '; var_dump("a" !== " ");
echo '"a" !== "a": '; var_dump("a" !== "a");
echo '"a" ==! " ": '; var_dump("a" ==! " ");
echo '"a" ==! "a": '; var_dump("a" ==! "a");
?>

Cela produit cette sortie:

int
1 !== 0: bool(true)
1 !== 1: bool(false)
1 ==! 0: bool(true)
1 ==! 1: bool(false)
bool
true !== false: bool(true)
true !== true: bool(false)
true ==! false: bool(true)
true ==! true: bool(false)
string
"a" !== " ": bool(true)
"a" !== "a": bool(false)
"a" ==! " ": bool(false)
"a" ==! "a": bool(false)

L'opérateur semble fonctionner pour les variables booléennes et entières, mais pas pour les chaînes. Je ne peux pas trouver ==!dans la documentation PHP ou quoi que ce soit à ce sujet sur aucun moteur de recherche (essayé Google, Bing, DuckDuckGo, mais je soupçonne qu'ils essaient de l'interpréter au lieu de rechercher la chaîne littérale). Quelqu'un a-t-il déjà vu cela et peut-il faire la lumière sur ce comportement?

Gérald Schneider
la source
57
allez ... qu'est-ce que c'est que les votes positifs? Je peux poser une douzaine de questions comme celle-ci. Et accompagnez-les d'une analyse quasi sérieuse. Ceci est la pratique standard des exercices manuels, non. Dans SO, nous votons pour la qualité et l'information, pas pour le plaisir et le divertissement.
sehe
51
@sehe Il reçoit des votes positifs parce que c'est la définition d'une question bien documentée - il a «longuement cherché une réponse», «a été précis», la question est «pertinente pour les autres» et «sur le sujet». le PO a essayé des choses et nous a montré ce qu'il a essayé; c'est le genre de question que ce site tente de susciter
JRaymond
11
@JRaymond: il obtient des votes positifs parce que c'est une question triviale pour un problème et une réponse très faciles à comprendre. L'aspect trivial augmente la curiosité, ce qui attire plus de gens, et l'aspect facile augmente le pourcentage de personnes qui comprennent suffisamment la question et la réponse pour voter. Ce n'est pas lié au fait que ce soit une bonne question ou non.
Thomas Bonini
4
@JRaymond, admettez-le, la plupart des questions à haut vote sont des anecdotes. Jetez un œil à mes trois questions parmi tant d'autres: 1 , 2 , 3 . Aucun d'entre eux n'est quelque chose que vous pourriez trouver sur Google (contrairement à la plupart des questions à haut vote) et ils sont bien pensés et essayés avant d'être écrits (je sais, parce que je les ai écrits). Cependant, comme ce sont des questions qui nécessitent une expertise, elles n'obtiennent jamais de votes élevés. C'est ainsi que fonctionne le système ici.
Shahbaz
3
@JRaymond sehe a raison. Les écrivains auraient une journée de terrain sur SO. Je suggérerais de parcourir cette liste ( php.net/quickref.php ) et de trouver des problèmes intéressants où la fonction est la solution. Plus la situation ou la fonction est obscure et intéressante, plus il y a de votes.
Mike B

Réponses:

243

La différence est qu'il n'y a pas d'opérateur ==!.

Cette expression:

$a ==! $b

Est fondamentalement le même que celui-ci:

$a == (!$b)
Bang Dao
la source
10
Wow, beaucoup de bonnes réponses en si peu de temps. J'ai choisi la première réponse qui clarifiait que le! s'applique à la variable de droite et a donc le plus de valeur. Désolé pour les autres gars;)
Gerald Schneider
4
@Gerald Schneider: Le moins que vous puissiez faire pour compenser cela était d'améliorer cette réponse afin qu'elle soit au moins à égalité avec les autres réponses en termes de grammaire et de mise en forme (dont vous avez spécifiquement appelé pour son explication très détaillée !). Mais peu importe, je l'ai édité maintenant.
BoltClock
Je ne programme même pas en PHP et même j'ai réalisé que "==!" serait lu comme les 2 opérateurs "==" et "!". Cela montre simplement l'effet qu'un peu de mise en page peut avoir sur la façon dont vous lisez quelque chose.
StarNamer
2
@Bang Dao Euh, JavaScript? Il a === et! ==. Mais non ==!
psr
2
@BangDao Maintenant, vous avez trouvé une autre raison pour w3fools Veuillez la lire, c'est important.
certains
77

Il n'y a pas d' ==!opérateur en PHP

C'est juste une combinaison de ==et !. Seul l'opérateur pertinent présent ici est ==. Donc, la combinaison ==!fonctionnera comme une ==vérification normale Equality, et croyez-moi,

$variable_a ==! $variable_b 

n'est autre que

$variable_a == (!$variable_b)

Et ainsi;

"a" ==! " ": bool(false)
"a" ==! "a": bool(false) //is same as "a" == (!"a")

Et

true ==! false: bool(true)
true ==! true: bool(false)

La combinaison de plusieurs caractères d'opérateurs peut ne pas toujours fonctionner en tant qu'opérateur. par exemple, si nous prenons =et !, cela ne fonctionnera comme opérateurs que s'il est dans le modèle de !=ou !==. Il peut y avoir de nombreuses combinaisons pour ces caractères comme !====, !==!etc. etc. Les combinaisons d'opérateurs doivent être dans un format unique , un ordre unique , des combinaisons uniques (tous les caractères ne se combineront pas avec tous les autres caractères) et certainement, sans aucun espace entre eux .

Consultez la liste des opérateurs ci-dessous;

entrez la description de l'image ici

Alfred
la source
2
Je suis tombé sous la même illusion de pouvoir utiliser un <table>.
Chad Harrison
+ J'ai presque pensé que c'était une table ... mais c'est en fait une image
Baba
38

==! n'est pas un opérateur mais deux:

== et !

! ayant une priorité plus élevée que ==

Alors :

"a" !== " ": bool(true) -> vrai car "a" n'est vraiment pas égal à ""

"a" ==! " ": bool(false) -> false car "a" n'est pas égal à! ""

Peut être écrit avec un espace entre == et!.

Michael Laffargue
la source
1
false because "a" is not equals to !" "! "" signifie transtyper en booléen et nier que "" est vrai et! "" est faux.
Zaffy
@quarry Oui, je ne suis pas allé trop loin dans l'explication: p
Michael Laffargue
29

==!n'existe pas en tant que tel. C'est une notation quelque peu cryptique de== !

Comme les espaces n'ont pas d'importance dans ces opérations, vous pouvez tout aussi facilement écrire a --> b, ce qui équivaut à a-- > b, mais aura l'air étrange.

Donc, quant à la question: "a" ==! " "sera analysé "a" == !" ". Négation d'une chaîne est couvert par la coulée , ce qui signifie une chaîne mais "0"et " "est, quand casted, true.

Ainsi, l'expression "a" == !" "sera transférée:

  1. "a" == !" "
  2. "a" == !false
  3. "a" == true

Et, comme ce string "a"n'est pas la même chose bool true, cela évalue l'expression entière à false.

Alors, quelle est la morale de l'histoire? Ne vous laissez pas confondre par des espaces manquants ou mal placés! :)

FP
la source
3
contrairement à ce qui est indiqué dans cette réponse, "a" == true est évalué à true car une chaîne non vide est convertie en valeur booléenne true. L'expression "a" === true serait évaluée à false.
Pascal Rosin
25

==! n'est pas un opérateur

==!n'est pas du tout un opérateur de comparaison php - c'est la même chose que == !(notez l'espace)

C'est à dire

if ("a" !== " ") {
    // evaluates to true - "a" and " " are not equal
}

if ("a" == !" ") {
    // unreachable
} else {
    // evaluates to false - "a" is not equal to true (!" " evaluates to true)
}
AD7six
la source