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?