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?
la source
Réponses:
La différence est qu'il n'y a pas d'opérateur
==!
.Cette expression:
Est fondamentalement le même que celui-ci:
la source
Il n'y a pas d'
==!
opérateur en PHPC'est juste une combinaison de
==
et!
. Seul l'opérateur pertinent présent ici est==
. Donc, la combinaison==!
fonctionnera comme une==
vérification normaleEquality
, et croyez-moi,n'est autre que
Et ainsi;
Et
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;
la source
<table>
.==!
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!.
la source
false because "a" is not equals to !" "
! "" signifie transtyper en booléen et nier que "" est vrai et! "" est faux.==!
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:"a" == !" "
"a" == !false
"a" == true
Et, comme ce
string "a"
n'est pas la même chosebool 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! :)
la source
==! 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
la source