【问题标题】:Is There A Difference Between strlen()==0 and empty()?strlen()==0 和 empty() 之间有区别吗?
【发布时间】:2011-10-27 17:27:23
【问题描述】:

我正在查看其他人编写的一些表单验证代码,我看到了:

strlen() == 0

在测试表单变量是否为空时,我使用empty() 函数。一种方式比另一种更好吗?它们在功能上是否相同?

【问题讨论】:

    标签: php strlen


    【解决方案1】:

    在几种情况下它们会有不同的行为:

    empty('0'); // returns true, 
    strlen('0'); // returns 1.
    
    empty(array()); // returns true,
    strlen(array()); // returns null with a Warning in PHP>=5.3 OR 5 with a Notice in PHP<5.3.
    
    empty(0); // returns true,
    strlen(0); // returns 1.
    

    【讨论】:

      【解决方案2】:

      strlen用于获取字符串中的字符数,empty用于测试变量是否为空

      空的意思:

      empty("") //is empty for string
      empty(0) // is empty for numeric types
      empty(null) //is empty 
      empty(false) //is empty for boolean
      

      【讨论】:

      • 您(和其他一些人)所说的正是我的想法。我以前从未见过有人尝试使用strlen 检查变量是否为空,我怀疑他们的代码实际上是否具有预期的效果。感谢大家的澄清。
      • 为什么这个可读性很好(并且被接受)的答案只被投票一次?有错吗?
      • if (!strlen($_POST['id'])) { //blah } 如果我这样写条件是什么意思。?布尔值与否。? @red4d @dpp
      • 我认为接受的答案应该强调主要区别在于,在测试“0”字符串时,strlen()==0 将返回 false,而 empty() 将返回 true。有些人可能会将在字符串上调用empty() 理解为等同于检查它是否等于空字符串,这是错误的,因为这种容易出错的边缘情况!
      【解决方案3】:

      以下的东西被认为是空的:

      "" (an empty string)
      0 (0 as an integer)
      0.0 (0 as a float)
      "0" (0 as a string)
      NULL
      FALSE
      array() (an empty array)
      var $var; (a variable declared, but without a value in a class)
      

      strlen() 只是检查字符串 len 是否为 0。它不检查 int、float 等。你的情况是什么。

      reference

      【讨论】:

        【解决方案4】:
        $f = 0; echo empty($f)? 'Empty':'Full'; // empty
        $f = 0; echo strlen($f); // 1
        

        对于我使用isset 的表单。它更明确。 ;-)

        【讨论】:

          【解决方案5】:

          如果$x = "0"empty() 将返回 true。所以还是有区别的。

          http://docs.php.net/manual/en/types.comparisons.php

          【讨论】:

            【解决方案6】:

            empty 与 boolean false 相反。

            empty 是一种语言结构。

            strlen 是一个函数。

            strlen 返回字符串的字节长度。

            strlen($str)==0是字节长度为0的比较(松散比较)。

            如果字符串为空,则比较结果为真 - 就像empty($str) 的表达式在为空(零长度)字符串的情况下所做的那样。

            但是对于其他一切:

            empty 与 boolean false 相反。

            strlen 返回字符串的字节长度。

            他们彼此之间的分享不多。

            【讨论】:

            • 嗨哈克雷。首先,让我说我真的很警惕质疑某人与你的代表的陈述,但你的意思是说空是假的反面吗?真的是假的对立面,空是假的吗?也许我变老了..!
            【解决方案7】:

            strlen 方法几乎是完美的,如果你想检查某个东西是否“作为字符串是空的”,也就是说,当单个零不应该被视为空字符串、空数组、null 和 false 时应该都是被认为没有价值。这是经常需要的。

            所以我的建议是:

                count($x)*strlen("$x")
            

            这给了你:

            • 0 为假

            • 0 为空

            • 0 代表“”(空字符串)

            • 0 表示 [ ](空数组),没有警告

            • 1 表示数字零

            • 1 代表“0”(零字符串)

            当然,您可以使用empty($x) &amp;&amp; "$x"!=="0" - 它更重要,但噪音更大,而且令人惊讶的是,它们的时间成本几乎相等(一百万次迭代不到 50 毫秒),因此没有理由选择另一个。此外,如果您在 strlen 之前添加 !!(布尔型转换),您将得到一个明确的 0/1 答案,有时它可能比 true/false(调试情况、切换等)更方便。

            还要注意不能像这样检查对象。如果有可能出现对象,请使用 empty() 方法。物体是顽固的生物。

            【讨论】:

              【解决方案8】:

              empty() 适用于所有变量类型。我认为strlen() 最好与字符串或可以安全地转换为字符串的东西一起使用。例如,

              strlen(array());
              

              会抛出PHP Warning: strlen() expects parameter 1 to be string, array given错误

              【讨论】:

                【解决方案9】:

                当输入为0时,

                strlen(0) = 1
                empty(0) = false <-- non-empty
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2015-02-23
                  • 2014-08-30
                  • 2010-09-27
                  • 1970-01-01
                  • 2020-01-01
                  • 1970-01-01
                  • 2012-02-16
                  • 2012-06-17
                  相关资源
                  最近更新 更多