Ayer me topé con esto cuando modifiqué el código PHP escrito por otra persona. Me desconcertó que una comparación simple ( if ($var ==! " ")
) no funcionara como se esperaba. Después de algunas pruebas, me di cuenta de que quien escribió ese código lo usó en ==!
lugar de !==
como operador de comparación. Nunca he visto ==!
en ningún idioma, así que me pregunté cómo demonios podría funcionar este código e hice algunas pruebas:
<?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");
?>
Esto produce esta salida:
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)
El operador parece funcionar para variables booleanas y enteras, pero no para cadenas. No puedo encontrar ==!
en la documentación de PHP ni nada al respecto en ningún motor de búsqueda (probé Google, Bing, DuckDuckGo, pero sospecho que intentan interpretarlo en lugar de buscar la cadena literal). ¿Alguien ha visto esto antes y puede arrojar alguna luz sobre este comportamiento?
fuente
Respuestas:
La diferencia es que no hay operador
==!
.Esta expresión:
Es básicamente lo mismo que esto:
fuente
No hay
==!
operador en PHPEs solo una combinación de
==
y!
. Solo el operador relevante presente aquí es==
. Entonces, la combinación==!
funcionará de manera normal==
, comprobandoEquality
y confía en mí,no es otro que
y por lo tanto;
Y
La combinación de varios operadores de caracteres puede no funcionar como un operador siempre. por ejemplo, si tomamos
=
y!
, funcionará como operadores solo si está en el patrón de!=
o!==
. Puede haber numerosas combinaciones para estos caracteres como!====
,!==!
etc. , etc. Las combinaciones de operador deben estar en un formato único , un orden único , combinaciones únicas (todos los caracteres no se combinarán con todos los demás caracteres) y definitivamente, sin ningún espacio entre ellos .Verifique la lista de operadores a continuación;
fuente
<table>
.==!
no es un operador sino dos:==
y!
!
tener una mayor prioridad que==
Entonces :
"a" !== " ": bool(true)
-> verdadero porque "a" realmente no es igual a """a" ==! " ": bool(false)
-> falso porque "a" no es igual a ""Podría escribirse con un espacio entre == y!.
fuente
false because "a" is not equals to !" "
! "" significa lanzar a bool y negar que "" es verdadero y! "" es falso.==!
no existe como tal Es una notación algo críptica de== !
Como los espacios no importan en esas operaciones, podría escribir fácilmente
a --> b
, lo que se evalúaa-- > b
, pero se verá extraño.Entonces, en cuanto a la pregunta:
"a" ==! " "
se analizará"a" == !" "
. Negación de una cadena está cubierta por la fundición , es decir, cualquier cadena, pero"0"
y" "
es que, cuando fundido,true
.Por lo tanto, la expresión
"a" == !" "
se transferirá:"a" == !" "
"a" == !false
"a" == true
Y, como
string "a"
no es lo mismo quebool true
, esto evalúa la expresión completa afalse
.Entonces, ¿cuál es la moraleja de la historia? ¡No te confundas con espacios faltantes o mal ubicados! :)
fuente
==! no es un operador
==!
no es un operador de comparación de php en absoluto: es lo mismo que== !
(tenga en cuenta el espacio)Es decir
fuente