【问题标题】:What is the difference between null and empty?null 和 empty 有什么区别?
【发布时间】:2011-04-11 00:38:09
【问题描述】:

我不熟悉空和空的概念。虽然我努力理解它们之间的区别,但我更加困惑。我在http://www.tutorialarena.com/blog/php-isset-vs-empty.php 看到了一篇文章,但是我仍然看不到您何时会在验证表单时使用 isset 和 empty。看到我没有掌握区别,我不想使用不正确的功能以及无法使用其他区域的功能。有人可以举一些例子来帮助我理解吗?我对编码非常陌生,所以如果有人能给我提供真实世界的例子,同时保持它足够简单,让菜鸟学习,我将不胜感激。

【问题讨论】:

标签: php null isset


【解决方案1】:

如果变量没有值,则为NULL,并且不指向内存中的任何位置。

empty() 更多的是 empty 的字面意思,例如字符串 "" 为空,但 不是 NULL

考虑以下几点 为空:

  • “”(空字符串)
  • 0(0为整数)
  • 0.0(0 作为浮点数)
  • “0”(0作为字符串)
  • 错误
  • array()(一个空数组)
  • 变量 $var; (声明的变量,但在类中没有值)

Source.


示例

$aNULL

$a = '',但不是NULL


更新

如果$a='' 为空但NULL 不为空,我何时使用empty() 函数以及何时使用isset() 函数。

isset() 将返回FALSE 是变量指向NULL

当您了解什么是时使用empty()(查看上面的列表)。

还有,当你说它在记忆中没有任何意义时,这到底是什么意思?

这意味着$str = ''将作为长度为0的字符串在内存中。

如果是$str = NULL,则不会占用任何内存。

【讨论】:

  • 谢谢亚历克斯。现在是令人困惑的部分。如果 $a='' 为空但不是 NULL,我什么时候使用 empty() 函数,什么时候使用 isset() 函数。另外,当您说它在内存中没有任何意义时,这到底是什么意思?
  • 谢谢@Alex。这让我更加困惑。所以让我给你一个例子,也许你可以帮助我消除我的困惑。我有一个表单,我希望用户提供他们的用户名和密码。现在我想验证用户是否已发布表单以及用户是否输入了用户名和密码。现在在那个例子中,我什么时候考虑使用 isset,什么时候考虑使用 empty,为什么?
  • @PeanutsMonkey 在那种情况下我肯定会使用empty()。您应该只从用户提交的表单中接收字符串。明智的做法是先trim() 值,否则由空格组成的字符串不会为空。
  • @Alex。谢谢。好的,现在如果扩展该示例,以便我真正了解何时使用 isset 和 empty。我知道对于函数 empty(),除以下值外的每个值都等于 true。这是 $value='a'。这意味着空是错误的。现在,如果有任何其他价值或没有价值,即 $a; $a=''; $a=0; $a='0'; $a=空; $a=假;然后 empty() 将等于 true。当空为假时,例如$a='a';,则变量已设置。
  • @Alex 继续 - 当 empty() 更广泛时,为什么我会使用 isset 来验证数据,因为我的理解是 empty() 迎合 $a='' 这将是没有数据由用户输入,这意味着该变量已设置并且它不为空?
【解决方案2】:

Null 是一个占位符,通常表示“没有可用的相关数据”。

为此使用 null 只是一种约定,但相当普遍,以至于某些编程语言直接支持该约定。这个约定存在的原因在历史上与“指针”有关; 很多时候,一个过程将被定义为返回一个指向答案的指针,如果由于某种原因它不能产生答案,它将返回传统上称为 Null 的指针。

意味着(如果这是一个集合)它没有成员。这是一个明确的答案,与“没有可用的相关数据”截然不同。

在 PHP 世界中,显然未初始化的变量具有 Null 值,并且此类变量上的 isset 返回 FALSE。 对于数组和字符串,PHP 遵循“空”表示“没有成员”的约定,尽管数组和字符串在技术上不是集合。

PHP 显然有一个有趣的想法,即 0 和 0.0 也是由 PHP 设计的“空”。这是对“空”恕我直言的概念的滥用:个别数字不是集合,因此 0 不能合理地通过“空”。这只会导致晦涩的编程,因为它违反了最小意外原则。我敢肯定 PHP 设计者会将“零是空数”作为某种模糊的类比;但是如果类比是模糊的,为什么要费心呢?但是 PHP 充满了愚蠢的想法。

【讨论】:

    【解决方案3】:

    下表是这些函数针对不同值返回的内容的简单参考。空格表示函数返回 bool(false)。

    更多信息请参考此链接https://www.virendrachandak.com/techtalk/php-isset-vs-empty-vs-is_null/

    【讨论】:

      【解决方案4】:

      NULL 是一个特殊值,它明确表示该变量尚未设置为任何值。使用 empty() 函数时要小心,因为您不能只使用它来确定变量是否为 NULL。例如,如果 int 设置为 0,empty() 函数将返回 true。如果您需要确保变量完全是 NULL,请使用 if($variable == NULL)

      有关empty() 的更多信息,请参阅http://php.net/manual/en/function.empty.php

      【讨论】:

        【解决方案5】:

        这里有一些很好的答案,我不再赘述。但是,在验证表单的情况下,当提交表单时,每个表单输入元素的值都会在$_POST 变量中发送到服务器。您可以使用isset() 来检查特定输入是否存在。

        isset($_POST['username'])
        

        如果返回 true,那么对服务器的请求是发布包含名为“用户名”的输入元素的表单的结果。现在我们知道我们有该表单元素的值,我们可以查看它是否具有有效值。 empty() 会告诉我们用户是否真的在该字段中输入了任何数据,或者他们是否将其留空。

        empty($_POST['username'])
        

        如果返回 true,则提交给服务器的表单有一个名为“用户名”的字段,但用户在提交表单之前没有输入任何内容。

        【讨论】:

        • 好吧,与其使用 isset 验证表单是否已提交,为什么不使用 empty 验证表单是否已提交以及用户是否输入了任何数据?
        • 你可以。在isset() 所做的任何情况下,empty() 都会返回 true。您使用哪一种实际上取决于您当时正在测试的语义。
        • 好的。我不遵循它所依赖的语义。我怎么知道或者我怎么知道语义是什么?
        • “语义”是指您试图摆脱测试的含义。如果您只关心提交的表单是否包含有效(非空)数据,请使用empty()。如果您想检查表单是否实际已发布,或者表单是否包含特定字段,则需要检查 POST 变量是否实际存在,因此您使用isset()
        • 我想我明白你的意思。我应该根据我想要返回 true 的条件使用适当的函数。那是对的吗?例如,我知道 $_POST;如果我使用 empty() 函数会返回值 false,我最好使用 isset。
        【解决方案6】:

        自从我使用 PHP 以来已经有一段时间了,但如果其他语言有任何内容,则为空将指示一个没有内容的现有对象/映射/数组,而 null 将指示一个根本没有意义/定义的变量(未初始化)。

        在数据库 SQL 中,NULL 表示“没有值”。

        【讨论】:

          【解决方案7】:

          empty() 是一种快速查看变量是否包含任何有用信息的好方法……对于字符串,empty() 对 "" 字符串和空字符串返回 true。

          所以你可以这样写:

          if (! empty($name)) echo $name;
          

          更多信息请看这里:PHP: empty()

          【讨论】:

            【解决方案8】:

            isset() 如果同时满足这两个条件,则返回 true:

            1. 变量已定义,尚未取消设置。
            2. 变量中有一个非空值。

            当变量被设置为某个值(包括 null)时,它会自动定义。这对数组有直接影响。

            $a=array();
            $a['randomKey']=true;
            $a['nullKey']=null;
            var_dump(isset($a['randomKey'])); // true
            var_dump(isset($a['nullKey'])); // true, the key has been set, set to null!
            var_dump(isset($a['unsetKey'])); // false !
            unset($a['randomKey']);
            var_dump(isset($a['randomKey'])); // false ! it's been unset!
            

            从上面,您可以检查是否已设置各种 $_POST 字段。例如,按理说,已发布到的页面在 $_POST 字段中具有提交按钮名称。

            empty() 另一方面,测试变量是否包含非零值。这意味着 (int) 强制转换为 0 的值也返回 false。您可以使用它来查看特定的 $_POST 字段中是否包含数据。

            【讨论】:

              【解决方案9】:

              这个概念可以从数学中更好地理解。您是否曾尝试使用计算器(例如 7/0)将数字(非零)除以 0?您将得到如下所示的结果:undefinednot a numbernull 等。这意味着由于某些原因,该操作是不可能的(让我们改天讨论这些原因)。

              现在,执行此操作:0/7。您将得到输出 0。这意味着该操作是可能的并且可以执行,但您的答案只是 0,因为除法之后什么都没有。有一个有效的输出并且该输出为零。

              在第一个示例中,不仅输出无效,操作也无法执行。这类似于null。第二个例子类似于empty

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2014-01-02
                • 2011-02-14
                • 1970-01-01
                • 2011-04-16
                • 2016-12-23
                • 2011-06-24
                相关资源
                最近更新 更多