Ontem me deparei com isso quando modifiquei o código PHP escrito por outra pessoa. Fiquei desconcertado por uma comparação simples ( if ($var ==! " ")
) não funcionar como esperado. Após alguns testes, percebi que quem escreveu esse código usou em ==!
vez de !==
como operador de comparação. Eu nunca vi ==!
em nenhum idioma, então me perguntei como diabos esse código poderia funcionar e fiz alguns testes:
<?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");
?>
Isso produz esta saída:
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)
O operador parece funcionar para variáveis booleanas e inteiras, mas não para seqüências de caracteres. Não consigo encontrar ==!
na documentação do PHP nem nada sobre isso em nenhum mecanismo de pesquisa (tentei Google, Bing, DuckDuckGo, mas suspeito que eles tentem interpretá-lo em vez de procurar a string literal). Alguém já viu isso antes e pode lançar alguma luz sobre esse comportamento?
fonte
Respostas:
A diferença é que não há operador
==!
.Esta expressão:
É basicamente o mesmo que este:
fonte
Não há
==!
operador no PHPÉ apenas uma combinação de
==
e!
. Somente o operador relevante presente aqui é==
. Portanto, a combinação==!
funcionará normalmente==
, verificandoEquality
e confie em mim,não é outro senão
e assim;
E
A combinação de caracteres de vários operadores pode não funcionar como um operador sempre. por exemplo, se pegarmos
=
e!
, ele funcionará como operadores apenas se estiver no padrão de!=
ou!==
. Pode haver inúmeras combinações para estes personagens como!====
,!==!
etc .. etc .. combinações operador deve estar em formato único , ordem única , combinações únicas (todos os caracteres não vai combinar com todos os outros caracteres) e, definitivamente, sem qualquer espaço entre eles .Verifique a lista de operadores abaixo;
fonte
<table>
.==!
não é um operador, mas dois:==
e!
!
ter uma prioridade mais alta do que==
Assim :
"a" !== " ": bool(true)
-> verdadeiro porque "a" não é realmente igual a """a" ==! " ": bool(false)
-> false porque "a" não é igual a! ""Pode ser escrito com um espaço entre == e!.
fonte
false because "a" is not equals to !" "
! "" significa converter para bool e negar que "" é verdadeiro e! "" é falso.==!
não existe como tal. É uma notação um tanto enigmática de== !
Como os espaços não importam nessas operações, você pode escrever com a mesma facilidade
a --> b
, o que avaliaa-- > b
, mas parecerá estranho.Então, quanto à pergunta:
"a" ==! " "
será analisado"a" == !" "
. A negação de uma string é coberta pela conversão , significando qualquer string, mas"0"
e" "
é, quando convertidatrue
,.Assim, a expressão
"a" == !" "
será transferida:"a" == !" "
"a" == !false
"a" == true
E, como
string "a"
não é o mesmobool true
, isso avalia toda a expressão parafalse
.Então, qual é a moral da história? Não se deixe confundir com espaços ausentes ou errados! :)
fonte
==! não é um operador
==!
não é um operador de comparação de php - é o mesmo que== !
(observe o espaço)Ou seja,
fonte