ternario operador not etiquetas empty php comparison operators comparison-operators

php - operador - Diferencia entre "!==" y "==!"



php is not null or empty (5)

¡No hay ==! operador en PHP

Es solo una combinación de == y ! . El único operador relevante presente aquí es == . Entonces la combinación ==! funcionará igual que un normal == , verificando Equality , y créanme,

$variable_a ==! $variable_b

no es otro que

$variable_a == (!$variable_b)

y por lo tanto;

"a" ==! " ": bool(false) "a" ==! "a": bool(false) //is same as "a" == (!"a")

Y

true ==! false: bool(true) true ==! true: bool(false)

La combinación de varios operadores puede no funcionar como 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 personajes como !==== !==! etc. Las combinaciones de operadores deben estar en formato único , orden único , combinaciones únicas (todos los personajes no se combinan con todos los demás personajes) y definitivamente, sin ningún espacio entre ellos .

Verifique la lista de operadores a continuación;

Ayer tropecé con esto cuando modifiqué el código PHP escrito por otra persona. Me sorprendió que una simple comparación ( if ($var ==! " ") ) No funcionara como se esperaba. ¡Después de algunas pruebas me di cuenta de que quien escribió ese código usó ==! en lugar de !== como operador de comparación. ¡Nunca he visto ==! en cualquier idioma, así que me pregunté cómo diablos este código podría funcionar 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 o cualquier otra cosa al respecto en cualquier 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 algo de luz sobre este comportamiento?


==! no es un operador

==! no es un operador de comparación php para nada, ¡es lo mismo que == ! (tenga en cuenta el espacio)

Es decir

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) }


¡La diferencia es que no hay operador ==! .

Esta expresión:

$a ==! $b

Es básicamente lo mismo que esto:

$a == (!$b)


==! no es un operador sino dos:

== y !

! teniendo una prioridad más alta que ==

Asi que :

"a" !== " ": bool(true) -> verdadero porque "a" no es realmente igual a ""

"a" ==! " ": bool(false) "a" ==! " ": bool(false) -> falso porque "a" no es igual a! ""

Podría escribirse con un espacio entre == y!


==! 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 , que se evalúa como a - a-- > b , pero se verá extraño.

Entonces, en cuanto a la pregunta: "a" ==! " " "a" ==! " " se analizará en "a" == !" " . La negación de una cuerda está cubierta por el casting , es decir, cualquier cadena pero "0" y " " es, cuando se convierte, true .

Por lo tanto, la expresión "a" == !" " transferirá:

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

Y, como la string "a" no es lo mismo que bool true , esto evalúa la expresión completa como false .

Entonces, ¿cuál es la moraleja de la historia? ¡No te dejes confundir por espacios faltantes o colocados incorrectamente! :)