2012-03-17 9 views
5

en PHP 5PHP empty var == 0?

$my_var = ""; 

    if ($my_var == 0) { 
    echo "my_var equals 0"; 

    } 

Por qué se evalúa cierto? ¿Hay alguna referencia en php.net al respecto?

Respuesta

3

PHP is a weakly typed language. Las cadenas vacías y booleano falso se evaluarán a 0 cuando se prueban con el operador igual ==. Por otro lado, puede forzar a comprobar el tipo mediante el operador idéntica === como tal:

$my_var = ""; 

if ($my_var === 0) { 
    echo "my_var equals 0"; 
} else { 
    echo "my_var does not equal 0"; 
} 

Esto debería darle un montón de información sobre el tema: How do the PHP equality (== double equals) and identity (=== triple equals) comparison operators differ?

1

En su primera línea, defina $my_var como cadena.

Dentro de la comparación se compara esa variable con un entero constante.

Si desea comparación exacta (no sé por qué es necesario comparar una cadena con un número entero, sin ningún dominante), se debe utilizar el ===:

if ($my_var === 0) { 
    echo "my_var equals 0"; 
} 

que nunca va a hacerse eco del mensaje.

El manual de PHP define en Comparison Operators section, el operador == como:

TRUE si $ a es igual a $ b después de tipo malabares.

Por lo tanto, lo importante aquí es type juggling.

De hecho, en PHP Manual: types comparisons, la segunda tabla indica exactamente que el entero 0 es igual a la cadena "".

1

Esto se debe a la coerción de tipo que proviene del operador de igualdad que está utilizando.

El PHP manual tiene las tablas de comparación de tipos para arrojar luz sobre esto.

En general, se considera una buena práctica utilizar el operador idéntico ===, para evitar tales casos de esquina (?).

0

aquí es la referencia en el manual de php sobre valores booleanos

http://www.php.net/manual/en/language.types.boolean.php

y aquí es la referencia para el valor NULL

http://www.php.net/manual/en/language.types.null.php 

$my_var = ''; 

if ($my_var == 0) { 
    echo "my_var equals 0" 
} 

evalúa a cierto porque "" es el mismo que NULL que evalúa como falso o 0

3

Una cadena y un número entero no son directamente comparables con == . Entonces, PHP realiza un malabarismo de tipo para ver si hay otra comparación razonable disponible.

Cuando una cadena se compara con un número entero, la cadena primero se convierte a un número entero.Puede encontrar los detalles de la conversión here. Básicamente, dado que "" no es un número válido, el resultado de la conversión es 0. Por lo tanto, la comparación se convierte en 0 == 0, lo que es claramente cierto.

Es probable que desee utilizar la comparación de identidad === para la mayoría (si no todas) sus comparaciones.

+0

hasta ahora he sido bueno con == simplemente olvidé que === existe ... – JohnA

Cuestiones relacionadas