php是空还是空?


208

我有一个关于NULLPHP 的问题:

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

为什么当我看到一个空字符串时为null$a?那是个错误吗?

Answers:


348

您正在寻找的是:

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

注意===。
当使用use ==时,PHP会将NULL,false,0,空字符串和空数组视为相等。


13
False,您的条件仅匹配uninitialized和null $variable。您实际上想要的是:($variable == null请注意==)
— Thomas LAURENT

6
@ThomasLAURENT,这就是OP所寻找的,他们想知道为什么== null要匹配空字符串,而不仅仅是空或未定义。
— 戈德温

3
糟糕,我的错误,但是您的最后一句话使我认为NULL,false,0和“” 严格相等,这是错误的,对不起您的误解。
— 托马斯·劳伦特

3
@詹姆斯是在PHP中预期的行为,它仍然是真实的,即使在2017年,将是真正的很长一段时间,我想
— 磁盘碎片整理

1
$a = ''是一个空的string,false是一个布尔值,$a = 0;是整数,null是从类型null。OP告诉我们的是,PHP将线程将它们的值作为“相同”,而不是类型的“相同”。因此,严格 ===检查还将检查类型,如果使用其他类型则失败。这就是您应该在返回值中保持一致的原因。如果你normaly在这样的方法返回一个字符串getName(),你不应该得到null,当它是空的,但更可能的emtpy 字符串 $user->getName() === ''或$user->getId() === 0或$user->isActive === false。预期的行为!
— Cagatay Ulubay '17

225

如下表中所示,empty($foo)是相当于$foo==null与is_null($foo)具有相同功能$foo===null。该表还显示了一些有关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   

我从不使用empty()和is_null()功能。使用简单比较可以减少歧义,更快和更清洁。尤其是括号将更少。

例如if($x==null || $y==null)vsif(is_null($x) || is_null($y))


2
表中缺少“ 0”和“ 0.0”。它们使事情变得非常棘手,尤其是empty()。这就是为什么我避免使用empty()的原因。
— datasn.io 2015年

1
@PHPst基于您显示的表,那么所谓的“简单比较”的php代码实际上是什么?
— Chetabahana '16

@hyip ==null和===null。
— PHPst 2016年

这应该是最好的答案,更完整。谢谢。
— pgr

@PHPst您说过,简单的比较不太含糊。您能否提供使用简单比较而不是这些NULL empty()等的示例?
— Naeem Ul Wahhab,

28

检查==与===

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

在哪里

'' === NULL将返回false
0 === NULL将返回false
false === NULL将返回false


经过测试并正确。''== null(true),而''=== null(false)
— TheLegendaryCopyCoder

18

不,这不是错误。查看带有==表的宽松比较表(第二个表),该表显示了将第一列中的每个值与其他列中的值进行比较的结果:

    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 ==“ php”或“ php” == 0都会得出true。那里发生了什么事?
— 罗伯特

1
@Robert:非数字开头的字符串在转换为0字符串时将转换为:codepad.org/qi40SG3E。这样(int)"php" == 0。
— Felix Kling 2013年

@Robert:我的意思是“当转换成数字时 ”。
— Felix Kling


8

如果使用==php,则将空字符串或数组视为null。要在null和之间进行区分empty,请使用===或is_null。所以:

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


if($ a === NULL)
— Caster


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.