web-dev-qa-db-fra.com

Différence entre "! ==" et "==!"

Hier, je suis tombé sur cela lorsque j'ai modifié 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 J'ai réalisé que celui qui a écrit ce code a utilisé ==! au lieu de !== comme opérateur de comparaison. Je n'ai jamais vu ==! dans n'importe quelle langue, je me suis donc demandé comment 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 trouve pas ==! dans la PHP ou quoi que ce soit à ce sujet sur n'importe quel moteur de recherche (a essayé Google, Bing, DuckDuckGo, mais je soupçonne qu'ils essaient de l'interpréter au lieu de rechercher la chaîne littérale). vu cela avant et peut éclairer ce comportement?

162
Gerald Schneider

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)
242
Bang Dao

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

C'est juste une combinaison de == et !. Le seul opérateur pertinent présent ici est ==. Donc, la combinaison ==! fonctionnera comme un normal ==, en vérifiant 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 comme un opérateur. par exemple, si nous prenons = et !, il ne fonctionnera comme des 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 format unique , ordre unique , combinaisons uniques (tous les caractères ne se combineront pas avec tous les autres caractères) et certainement sans espace entre eux .

Consultez la liste des opérateurs ci-dessous;

enter image description here

77
blasteralfred Ψ

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

== Et !

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

Donc :

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

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

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

38
Michael Laffargue

==! 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, qui correspond à a-- > b, mais aura l'air étrange.

Donc, quant à la question: "a" ==! " " sera analysé en "a" == !" ". La négation d'une chaîne est couverte par transtypage , ce qui signifie toute chaîne sauf "0" et " " est, une fois casté, true.

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

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

Et comme string "a" n'est pas la même chose que 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! :)

29
Florian Peschka

==! 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)
}
25
AD7six