2011-11-23 55 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