2012-03-17 10 views
5

in PHP 5PHP var vuoto == 0?

$my_var = ""; 

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

    } 

Perché è valutata vera? C'è qualche riferimento in php.net a riguardo?

risposta

3

PHP is a weakly typed language. Stringhe vuote e false booleane verranno valutate a 0 quando testate con l'operatore uguale ==. D'altra parte, è possibile forzare per controllare il tipo utilizzando l'operatore identica === come tale:

$my_var = ""; 

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

Questo dovrebbe dare una tonnellata di informazioni sul tema: How do the PHP equality (== double equals) and identity (=== triple equals) comparison operators differ?

1

Nella prima riga, si definisce $my_var come stringa.

All'interno del confronto si confronta tale variabile con un numero intero costante.

Se volete confronto esatto (non so il motivo per cui è necessario confrontare una stringa con un numero intero senza alcun getto), si dovrebbe usare il ===:

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

che non sarà mai eco il messaggio.

Il manuale PHP definisce in Comparison Operators section, l'operatore == come:

TRUE se $ a è uguale a $ b dopo tipo giocoleria.

Quindi, la cosa importante qui è type juggling.

In effetti, in PHP Manual: types comparisons, la seconda tabella indica esattamente che il numero intero 0 corrisponde alla stringa "".

1

Ciò è dovuto il tipo di coercizione derivante dall'operatore di uguaglianza che stai utilizzando.

Il PHP manual ha le tabelle Confronto tipo per far luce su questo.

È generalmente considerata una buona pratica utilizzare l'operatore identico === per evitare tali casi (?).

0

qui è il riferimento nel manuale php sui valori booleani

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

e qui è il riferimento per il valore NULL

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

$my_var = ''; 

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

viene valutato come vero perché "" è uguale a NULL che restituisce false o 0

3

Una stringa e un intero non sono direttamente confrontabili con == . Così PHP esegue giocoleria per vedere se c'è un altro confronto ragionevole disponibile.

Quando una stringa viene confrontata con un numero intero, la stringa viene prima convertita in un numero intero.Puoi trovare i dettagli della conversione here. Fondamentalmente, dal momento che "" non è un numero valido, il risultato della conversione è 0. Pertanto, il confronto diventa 0 == 0 che è chiaramente vero.

Probabilmente vorrai utilizzare il confronto di identità === per la maggior parte (se non tutti) i tuoi confronti.

+0

finora mi sono comportato bene == ho solo dimenticato che === esiste ... – JohnA

Problemi correlati