2009-11-23 17 views
39

En php, ($myvariable==0) Cuando $ myvariable es cero, el valor de la expresión es verdadero; cuando $ mivariable es nulo, el valor de esta expresión también es verdadero. ¿Cómo puedo excluir el segundo caso? Quiero decir que quiero que la expresión sea verdadera solo cuando $ myvariable sea cero. Por supuesto que puedo escribirPHP considera nulo es igual a cero

($myvariable!=null && $myvariable==0) 

pero ¿hay otra manera elegante de hacer esto?

Respuesta

0
$myvariable===0 


$a === $b 

Idéntico TRUE si $ a es igual a $ by si son del mismo tipo

0

Hay una función is_null, pero esto sólo se reemplazará su $myvariable!=null

3

Pruebe ($myvariable === 0) que no realizará ninguna coerción de tipo.

+6

: P Creo que no es el más rápido en el oeste ... – Skilldrick

4

Utilice la función php is_null() junto con el operador ===. !== también funciona de la manera esperada.

9

Insinúa una pregunta profunda: ¿cuándo debería ser cierta una expresión?

A continuación, voy a explicar por qué lo que está haciendo no está funcionando y cómo solucionarlo.

En muchos idiomas, null0, y la cadena vacía ("") todo como resultado false, esto puede hacer declaraciones if bastante sucinta e intuitiva, pero null, 0 y "" también son todos diferentes tipos. ¿Cómo deberían ser comparados?

This page nos dice que si tenemos dos variables que se comparan, a continuación, las variables se convierten de la siguiente manera (que sale de la mesa en el primer partido)

Type of First Type of Second Then 
null/string string   Convert NULL to "", numerical/lexical comparison 
bool/null  anything   Convert to bool, FALSE < TRUE 

Así que usted está comparando un valor nulo en comparación con un número. Por lo tanto, tanto el nulo como el número se convierten en booleanos. This page nos dice que en dicha conversión tanto null como 0 se consideran FALSE.

Su expresión ahora dice, false==false, que, por supuesto, es verdad.

Pero no es lo que quiere.

This page proporciona una lista de los operadores de comparación de PHP.

Example Name    Result 
$a == $b Equal    TRUE if $a equals $b after type juggling. 
$a === $b Identical   TRUE if $a equals $b, AND they are of the same type. 
$a != $b Not equal   TRUE if $a not equals $b after type juggling. 
$a <> $b Not equal   TRUE if $a not equals $b after type juggling. 
$a !== $b Not identical  TRUE if $a not equals $b, or they are not of the same type. 
$a < $b Less than   TRUE if $a is strictly less than $b. 
$a > $b Greater than  TRUE if $a is strictly greater than $b. 
$a <= $b Less than/equal TRUE if $a is less than or equal to $b. 
$a >= $b Greater than/equal TRUE if $a is greater than or equal to $b. 

El primer comparador es la comparación que está utilizando ahora. Tenga en cuenta que realiza las conversiones que mencioné anteriormente.

El uso del segundo comparador solucionará su problema. Como un nulo y un número no son del mismo tipo, la comparación === dará como resultado falso, en lugar de realizar la conversión de tipo como lo haría el operador ==.

Espero que esto ayude.

0

Si el cero podría ser una cadena, también debe comprobando considerará si el "cero cadena"

($myvariable === 0 || $myvariable === '0') 
5

Para identificar como nulo o cero por:

  • is_int($var) si una variable es una número o una cadena numérica. Para identificar Cero, el uso is_numeric($var) es también la solución o utilizar $var === 0

  • is_null($var) si una variable es NULL

-1

Para mi caso encontré este Soulution y funciona para mí:

if ($myvariable == NULL) { 
    codehere... 
} 
0

Me enfrenté a un problema similar en uno de mis proyectos, con una pequeña diferencia de que también estaba usando los valores CERO como valor válido para mi condición. así es como lo resolví usando lógica simple para separar NULL de cero y otros valores.

if (gettype($company_id) === 'NULL') { 
     $company = Company::where('id', Auth::user()->company_id)->first(); 
    } else { 
     $company = Company::where('id', $company_id)->first(); 
    }