2011-11-23 126 views
128

我有一個關於PHP和NULL一個奇怪的問題,請參見下面的代碼:php爲空或空?

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

爲什麼我看到爲空?如果$a是空的,那是一個錯誤嗎?謝謝。

回答

233

什麼你要找的是:

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

PHP對待NULL,和空字符串平等。

+4

假,你的條件只匹配未初始化和空'''$ variable'''。 你想要的其實是:'''$ variable == null'''(注意''== ==''') –

+3

@ThomasLAURENT,這就是OP所要找的,他們想知道爲什麼'== null '是匹配空字符串,而不僅僅是null或undefined。 – Godwin

+1

Oups我的錯誤,但你的最後一句話讓我認爲NULL,false,0和**嚴格相等**這是錯誤的,對於誤解抱歉。 –

10

這個不是一個錯誤,但PHP的正常行爲。這是因爲PHP中的==運算符不檢查類型。

'' == null == 0 == false 

如果您還想檢查值具有相同的類型,使用===代替。深入研究這種差異,請閱讀official documentation

15

不,這不是一個錯誤。看一看在Loose comparisons with == table(第二個表),這顯示了每個值在第一列與其他列的值進行比較的結果是:

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

    [...]  

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

在那裏,你可以看到一個空字符串""false比較,0,NULL""將產生真實。

您可能想用is_null[docs]代替,或者使用嚴格比較(第三個表格)。

+0

鬆散的比較表似乎表明,比較0 ==「PHP」或「PHP」== 0都將產生真實。那裏發生了什麼? – Robert

+1

@Robert:當轉換爲字符串時,不以數字開頭的字符串被轉換爲「0」:http://codepad.org/qi40SG3E。所以'(int)「php」== 0「。 –

+0

@Robert:我的意思是*「投到**號碼**」時*。 –

18

檢查== VS ===

'' == NULL將返回true
0 == NULL將返回true
false == null將返回true

其中作爲

'' === NULL將返回false
0 === NULL會返回false
false === NULL將返回false

171

如下表中所示,empty($foo)相當於$foo==nullis_null($foo)具有$foo===null相同的功能。該表還顯示了一些關於null比較的棘手值。 (φ表示未初始化的變量。)

我從來不使用empty()is_null()函數。使用簡單的比較不那麼模糊,更快和更清晰。

  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 
+1

表中缺少「0」和「0.0」。它們使事情變得非常棘手,尤其是空()。這就是爲什麼我避免使用空()。 –

+0

@PHPst基於您所展示的表格,那麼實際上您稱之爲「簡單比較」的php代碼是什麼? – hyip

+0

@hyip'== null'and'=== null'。 – PHPst

5

如果使用==,PHP把一個空字符串或數組作爲null。要區分nullempty,請使用===is_null。所以:

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

+0

if($ a === NULL) – Caster