【问题标题】:php is null when empty? [duplicate]php 为空时为空? [复制]
【发布时间】:2012-01-04 09:36:53
【问题描述】:

我对 PHP 中的 NULL 有疑问:

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

$a 是空字符串时,为什么我会看到is null?这是一个错误吗?

【问题讨论】:

    标签: php null


    【解决方案1】:

    您正在寻找的是:

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

    注意===
    当使用== 时,和你一样,PHP 会处理 NULLfalse0empty 字符串,和 empty 数组相等。

    【讨论】:

    • False,你的条件只匹配未初始化和空的$variable。你想要的其实是:$variable == null(注意==
    • @ThomasLAURENT,这就是 OP 正在寻找的东西,他们想知道为什么 == null 匹配的是空字符串,而不仅仅是 null 或 undefined。
    • Oups 我的错误,但你的最后一句话让我认为 NULL、false、0 和 "" 是严格相等的,这是错误的,很抱歉造成误解。
    • @James 这是 PHP 中的预期行为,即使在 2017 年仍然如此,而且我想在很长一段时间内都会如此
    • $a = '' 是一个空的 stringfalse 是一个布尔值,$a = 0; 是一个整数,null 来自于类型 null。 OP 告诉的是 PHP 会将它们作为“相同”的值进行线程化,但在类型上不会“相同”。因此,strict === 检查也会检查类型,如果您使用不同的类型,则会失败。这就是您应该在返回值中保持一致的原因。如果您通常在getName() 之类的方法中返回一个字符串,那么当它为空时您不应该得到null,而更可能是一个空的string $user->getName() === ''$user->getId() === 0$user->isActive === false .预期行为!
    【解决方案2】:

    如下表所示,empty($foo)等价于$foo==nullis_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   
    

    【讨论】:

    • 表格中缺少“0”和“0.0”。它们让事情变得非常棘手,尤其是 empty()。这就是我避免使用 empty() 的原因。
    • @PHPst 基于您显示的表格,那么您所谓的“简单比较”的 php 代码实际上是什么?
    • @hyip ==nulland ===null.
    • 这应该是最佳答案,更完整。谢谢。
    • @PHPst 你说简单的比较不那么模棱两可。您能否提供一个使用简单比较而不是这些 NULL empty() 等的示例。
    【解决方案3】:

    检查=====

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

    在哪里

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

    【讨论】:

    • 测试并正确。 ''==null (true) 而 ''===null(false)
    【解决方案4】:

    不,这不是错误。查看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
    

    在那里你可以看到空字符串 ""false0NULL"" 相比将得到 true。

    您可能想改用is_null [docs],或严格比较(第三张表)。

    【讨论】:

    • 松散比较表似乎表明比较 0=="php" 或 "php"==0 都会产生 true。那里发生了什么?
    • @Robert:不以数字开头的字符串在转换为字符串时会转换为0codepad.org/qi40SG3E。所以(int)"php" == 0.
    • @Robert:我的意思是 “当转换为 数字”时
    【解决方案5】:

    不是错误,而是 PHP 的正常行为。这是因为 PHP 中的 == 运算符不检查类型。

    '' == null == 0 == false
    

    如果您还想检查值是否具有相同的类型,请改用===。要深入研究这种差异,请阅读official documentation

    【讨论】:

      【解决方案6】:

      如果使用==,php 会将空字符串或数组视为null。要区分nullempty,请使用===is_null。所以:

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

      【讨论】:

      • if($a === NULL)
      【解决方案7】:

      PHP 7 isset() vs empty() vs is_null()

      【讨论】:

        【解决方案8】:

        如果有人正在处理 ,这将在处理  时起作用。

        先用str_replace()替换,再用empty()检查

        empty(str_replace(" " ,"" , $YOUR_DATA)) ? $YOUR_DATA = '--' : $YOUR_DATA;
        

        【讨论】:

          【解决方案9】:

          NULL 代表没有值的变量。要检查变量是否为 NULL,您可以使用 is_null($var) 或比较 (===) 与 NULL。但是,如果未定义变量,这两种方式都会生成警告。类似于isset($var)empty($var),可以作为函数使用。

          var_dump(is_null($var)); // true
          var_dump($var === null); // true
          var_dump(empty($var)); // true
          

          阅读更多How to check if a variable is NULL in PHP?

          【讨论】:

            【解决方案10】:

            使用empty - http://php.net/manual/en/function.empty.php

            例子:

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

            【讨论】:

              猜你喜欢
              • 2020-12-20
              • 1970-01-01
              • 1970-01-01
              • 2021-06-28
              • 2014-05-30
              • 1970-01-01
              • 1970-01-01
              • 2017-05-29
              • 1970-01-01
              相关资源
              最近更新 更多