php è nullo o vuoto?


208

Ho una domanda relativa NULLa PHP:

  $a = '';
  if($a == NULL) {
      echo 'is null';
  }

Perché vedo null quando $aè una stringa vuota? È un bug?

Risposte:


348

Quello che stai cercando è:

if($variable === NULL) {...}

Nota il ===.
Quando l'uso ==, come hai fatto tu, PHP tratta NULL , falso , 0 , il vuoto stringa e vuoti array come uguali.


13
Falso, la tua condizione corrisponde solo a non inizializzata e nulla $variable. In realtà quello che vuoi è: $variable == null(nota ==)
Thomas LAURENT

6
@ThomasLAURENT, ecco cosa stava cercando l'OP, si chiedevano perché == nullcorrispondesse alla stringa vuota e non solo nulla o indefinito.
Godwin,

3
Oup mio errore, ma la tua ultima frase mi ha portato a pensare che NULL, false, 0 e "" fossero rigorosamente uguali, il che è sbagliato, scusami per l'incomprensione.
Thomas LAURENT,

3
@James è un comportamento previsto in PHP, è ancora vero anche nel 2017 e suppongo che sarà vero per molto tempo
Deframmenta il

1
$a = ''è un vuoto string, falseè un valore booleano, $a = 0;è un numero intero ed nullè di tipo null. Ciò che OP sta dicendo è che PHP li inserirà come "stessi" in valore, ma non come "stessi" nel tipo. Quindi un controllo rigoroso === controllerà anche il tipo e fallirà se ne usi diversi. Questo è il motivo per cui dovresti essere coerente nei valori di ritorno. Se normalmente restituisci una stringa in un metodo come getName(), non dovresti ottenere nullquando è vuota, ma più probabilmente una stringa emtpy $user->getName() === ''o $user->getId() === 0o $user->isActive === false. Comportamento previsto!
Cagatay Ulubay,

225

Come mostrato nella tabella seguente, empty($foo)è equivalente $foo==nulle is_null($foo)ha la stessa funzione di $foo===null. La tabella mostra anche alcuni valori complicati relativi al nullconfronto. (ϕ indica una variabile non inizializzata.)

         empty    is_null 
         ==null  ===null  isset   array_key_exists
      ϕ |   T   |   T   |   F   |   F   
   null |   T   |   T   |   F   |   T   
     "" |   T   |   F   |   T   |   T   
     [] |   T   |   F   |   T   |   T
      0 |   T   |   F   |   T   |   T      
  false |   T   |   F   |   T   |   T   
   true |   F   |   F   |   T   |   T   
      1 |   F   |   F   |   T   |   T   
     \0 |   F   |   F   |   T   |   T   

Non uso mai empty()e is_null()funzioni. L'uso del confronto semplice è meno ambiguo, più rapido e più pulito. In particolare ci saranno meno parentesi graffe da abbinare.

ad es. if($x==null || $y==null)vsif(is_null($x) || is_null($y))


2
"0" e "0,0" mancanti nella tabella. Rendono le cose davvero difficili, soprattutto vuote (). Ecco perché evito di usare empty ().
datasn.io,

1
@PHPst Base sulla tabella che hai mostrato, quindi qual è in realtà il codice php di quello che hai chiamato 'confronto semplice'?
Chetabahana,

@hyip ==nulland ===null.
PHPst

Questa dovrebbe essere la risposta migliore, molto più completa. Grazie.
p.

@PHPst Hai detto che un semplice confronto è meno ambiguo. Potete per favore fornire un esempio di utilizzo del semplice confronto invece di questi NULL vuoti () ecc.
Naeem Ul Wahhab

28

controllare ==vs===

'' == NULLrestituire vero
0 == NULLrestituire vero
false == nullrestituire vero

mentre

'' === NULLrestituire false
0 === NULLrestituire false
false === NULLrestituire false


Testato e corretto. '' == null (true) while '' === null (false)
TheLegendaryCopyCoder

18

No, non è un bug. Dai un'occhiata ai confronti allentati con == tabella (seconda tabella), che mostra il risultato del confronto di ciascun valore nella prima colonna con i valori nelle altre colonne:

    TRUE    FALSE   1       0       -1      "1"     "0"     "-1"    NULL    array() "php"   ""

    [...]    

""  FALSE   TRUE    FALSE   TRUE    FALSE   FALSE   FALSE   FALSE   TRUE    FALSE   FALSE   TRUE

Ci si può vedere che una stringa vuota ""confronto con false, 0, NULLo ""produrrà vero.

È possibile che si desideri utilizzare is_null [documenti] o un confronto rigoroso (terza tabella).


La tabella dei confronti allentati sembra suggerire che il confronto 0 == "php" o "php" == 0 produrrà entrambi true. Cosa sta succedendo lì?
Robert,

1
@Robert: una stringa che non inizia con le cifre viene convertita in 0quando viene lanciata in una stringa: codepad.org/qi40SG3E . Così (int)"php" == 0.
Felix Kling,

@Robert: intendevo "quando trasmesso a un numero " .
Felix Kling,

12

Questo non è un bug ma un comportamento normale di PHP. Succede perché l' ==operatore in PHP non controlla il tipo.

'' == null == 0 == false

Se vuoi anche verificare se i valori hanno lo stesso tipo, usa ===invece. Per approfondire questa differenza, leggi la documentazione ufficiale .


8

Se lo usi ==, php considera una stringa o un array vuoti come null. Per fare la distinzione tra nulle empty, utilizzare ===o is_null. Così:

if($a === NULL) o if(is_null($a))


if ($ a === NULL)
Incantatore


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.