2012-01-30 6 views
5

He estado leyendo los documentos de PHP sobre malabarismos tipo y booleanos, pero todavía no entiendo por qué esta comparación se evalúa como verdadera. Mi entendimiento [incorrecto] me dice que en la declaración if, el entero 0 se considera FALSE y "a", siendo una cadena no vacía se considera TRUE. Por lo tanto, esperaba que esta comparación se resolviera en FALSE == TRUE y, finalmente, FALSE. ¿Qué parte me equivoqué?Operador de comparación - Tipo Malabarismo y booleanos

<?php 
      if(0 == "a"){ 
        $result = "TRUE"; 
      }else{ 
        $result = "FALSE"; 
      } 

      //$result == "TRUE" 
    ?> 

http://codepad.viper-7.com/EjxBF5

Respuesta

9

Cuando PHP hace una cadena < => Comparación entero, se intenta convertir la cadena en un número de una manera inteligente. La suposición es que si tiene una cadena "42", quiere comparar el valor 42 con el otro entero. Cuando la cadena no comienza con números, entonces su valor es cero.

De the docs:

El valor viene dado por la porción inicial de la cadena. Si la cadena comienza con datos numéricos válidos, este será el valor utilizado. De lo contrario, el valor será 0 (cero).

Este comportamiento también se infiere en comparison docs (consulte la primera línea en el primer ejemplo).

+0

Gracias por responder mi pregunta y ayudar a mi comprensión. – IsisCode

4

Tu error es que supones que operator == fuerza cada uno de sus operandos a booleanos antes de compararlos. No hace tal cosa.

Lo que pasa es que, dado que es comparing an integer to a string, la secuencia se convierte en un número entero (en este caso "a" converts to 0) y luego se realiza la comparación 0 == 0.

2

Funcionará si utiliza una comparación estricta === en lugar de ==. La comparación estricta también verifica el tipo de las variables, por lo que 0 === 'a' sería falso.

Cuestiones relacionadas