2009-11-23 18 views
39

In php, ($myvariable==0) Quando $ myvariable è zero, il valore dell'espressione è true; quando $ myvariable è null, anche il valore di questa espressione è vero. Come posso escludere il secondo caso? Voglio dire che voglio che l'espressione sia vera solo quando $ myvariable è zero. Naturalmente posso scriverePHP considera null uguale a zero

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

ma c'è un altro modo elegante per farlo?

risposta

0
$myvariable===0 


$a === $b 

Identico TRUE se $ a è uguale a $ b, e sono dello stesso tipo

0

C'è una funzione is_null, ma questo sarà solo sostituire il $myvariable!=null

1

La seconda soluzione non funzionerebbe neanche. Il === operator è la soluzione al tuo problema.

3

Provare ($myvariable === 0) che non eseguirà la coercizione di tipo.

+6

: P Immagino che non è la pistola più veloce del west ... – Skilldrick

4

Utilizzare la funzione php is_null() con l'operatore ===. !== funziona anche come ti aspetteresti.

9

Accenno a una domanda profonda: quando un'espressione può essere vera?

Qui di seguito, vi spiegherò il motivo per cui quello che state facendo non funziona e come risolvere il problema.

In molti linguaggi null, 0, e la stringa vuota ("") tutti valutare false, questo può rendere if dichiarazioni piuttosto succinta e intuitivo, ma null, 0 e "" sono anche tutti i diversi tipi. Come dovrebbero essere confrontati?

This page ci dice che se abbiamo due variabili a confronto, quindi le variabili sono convertiti come segue (in uscita dal tavolo al primo match)

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

Così si sta confrontando un valore nullo rispetto a un numero. Pertanto, sia il numero nullo sia il numero vengono convertiti in booleano. This page ci dice che in tale conversione sia null sia 0 sono considerati FALSE.

La tua espressione ora legge, false==false, che, ovviamente, è vero.

Ma non quello che vuoi.

This page fornisce un elenco di operatori di confronto di 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. 

Il primo comparatore è il confronto che si sta utilizzando ora. Si noti che esegue le conversioni che ho menzionato prima.

Utilizzando il secondo comparatore risolverà il vostro problema. Poiché un nullo e un numero non sono dello stesso tipo, il confronto === restituirà falso, anziché effettuare conversione del tipo come operatore == sarebbe.

Spero che questo aiuti.

0

Se il pari a zero potrebbe essere una stringa, si dovrebbe anche considere CONTROLLO DELLA "stringa di zero"

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

da identificare come nulla o zero:

  • is_int($var) se una variabile è un numero o una stringa numerica. Per identificare Zero, l'uso is_numeric($var) è anche la soluzione o utilizzare $var === 0

  • is_null($var) se una variabile è NULL

-1

Per il mio caso ho trovato questo soulution e funziona per me:

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

ho hade affrontato un problema simile in uno dei miei progetti, con una differenza minore che mi è stato anche utilizzando i valori zero come un valore valido per la mia condizione. ecco come ho risolto usando la logica semplice NULL separato da zero e altri valori.

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