【问题标题】:Is var set to null same as undefined and how to check differencesvar 设置为 null 是否与 undefined 相同以及如何检查差异
【发布时间】:2014-11-11 15:41:38
【问题描述】:

简单问题:在php中,var设置为null和undefined一样吗?

另外,最简单的检查方法是 var null 吗?

如何在不破坏代码的情况下使用此功能,例如。通过在配置数组中设置一些可以设置为null的可选内容。

如果使用is_null 检查null,如果未定义var,则可能会破坏代码。

is_nullisset 完全相反,但只有在您确定定义了 var 时才能使用。在其他所有情况下,isset 看起来更合适。

然后检查nullisset 是不恰当的,是吗

所以 var 可以是:

  • 未定义
  • 带有要检查的内容is_* 函数(numericstringarray、...)

【问题讨论】:

  • 请重新表述您的问题,因为问题标题询问它们是否相同,我回答了,但不是您真正要问的。
  • 但是你说是一样的。还是我错了?
  • 这两个状态是完全相等的,是的,但这并不是你要问的。您在问是否可以检查数组中的差异,幸运的是,您可以。
  • 不只是在数组中,按原样检查 $var,而不是数组。但是,谢谢你的贡献。我们找到了相同的答案。

标签: php null


【解决方案1】:

var 设置为 NULL 与 undefined 不同。

<?php
if (is_null($undefinedvariable)) {
    echo 'This variable is NULL';
}

此代码演示了如何产生混淆,因为它会导致显示消息“此变量为 NULL”,但它也会生成“未定义变量”通知。 (当然假设 $undefinedvariable 实际上是未定义的!)

【讨论】:

  • 这正是我想要避免的。破坏代码但仍要检查所有内容。
  • 如果你想避免“未定义变量”的通知,那么你需要使用 isset()
【解决方案2】:

当我对此提出疑问时,我经常参考这个网站:
https://www.virendrachandak.com/techtalk/php-isset-vs-empty-vs-is_null/

它将为您提供所有等效项的列表以及它们的真实性。

(undefined $var) == !isset($var) == empty($var) == is_null($var)

(var $var;)      == !isset($var) == empty($var) == is_null($var)

($var = NULL)    == !isset($var) == empty($var) == is_null($var)

所以,是的,两者是等价的。

你的问题的其余部分变得复杂(IDEOne):

&lt;table&gt;&lt;tr&gt;&lt;td&gt;Key&lt;/td&gt;&lt;td&gt;array_key_exists()&lt;/td&gt;&lt;td&gt;isset()&lt;/td&gt;&lt;td&gt;empty()&lt;/td&gt;&lt;td&gt;is_null()&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;$array['null']&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;$array['empty']&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;$array['zero']&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;$array['space']&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;$array['character']&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;$array['true']&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;$array['false']&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;$array['undefined']&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

如果要进行隐式检查,则必须进行组合:

if(array_key_exists($key, $array) {
    $check = $array[$key];
    if($check === NULL) {
        // set and null
    } elseif ($check === FALSE) {
        // set and FALSE
    } elseif ( /** additional checks, etc, etc... **/ ) { }
} else {
    // Not set
}

不幸的是,如果变量不在数组中,那么没有“get_defined_vars()”就无法做到这一点,我强烈反对在生产代码中使用它,因为它会由于未引用的数据而占用内存(对象将通过引用来表示,但这会复制所有其他变量,导致内存急剧增加。

简单地考虑undefined == !isset == NULL == empty 是一种很好的编码习惯。因为你要找的是数据,没有数据就没有数据。

【讨论】:

  • 其实我完全不喜欢那个网址。我很早就看到了,所以我不得不多挖一点。是的,我不想等价。例如。如果在配置数组中我跳过它必须是未定义的,如果我用 null 输入它必须表明它是 null,这与未定义不同。
  • 为你添加了一些帮助。
  • @MrW - 我还添加了array_key_exists() 支票。
【解决方案3】:

this 页面中,它看起来不一样,但实际上是一样的。

检查:

  • 未定义:!(isset($var) || array_key_exists('var',get_defined_vars())))
  • 空:array_key_exists('var', get_defined_vars()) &amp;&amp; is_null($var)
  • 空:isset($var) &amp;&amp; empty($var)
  • 内容:isset($var) &amp;&amp; !empty($var) + 任何其他 if_* 特定。

要使用我的配置数组而不是 get_defined_vars() 进行相同的检查,我只使用了 $configArr,它可以用于任何其他数组,例如过滤后的 POST。

检查空值:

$configArr = array('var' => null);

$isNull = array_key_exists('var', $configArr) && is_null($configArr['var']);

例子

Array
(
    [str] => Array
        (
            [isset] => TRUE
            [is_null] => FALSE
            [empty] => FALSE
            [array_key_exist] => TRUE
            [array_key_exist + is_null] => FALSE
        )

    [empty] => Array
        (
            [isset] => TRUE
            [is_null] => FALSE
            [empty] => TRUE
            [array_key_exist] => TRUE
            [array_key_exist + is_null] => FALSE
        )

    [null] => Array
        (
            [isset] => FALSE
            [is_null] => TRUE
            [empty] => TRUE
            [array_key_exist] => TRUE
            [array_key_exist + is_null] => TRUE
        )

    [undefined] => Array
        (
            [isset] => FALSE
            [is_null] => TRUE
            [empty] => TRUE
            [array_key_exist] => FALSE
            [array_key_exist + is_null] => FALSE
        )

)

最终结果:

$pRes = (!array_key_exists('var', $arrayOfVars)
            ? 0 // undefined
            : (is_null($arrayOfVars['var'])
                ? 1     // -> null
                : (empty($arrayOfVars['var']
                    ? 2  // -> empty
                    : 3  // -> custom
                    )
                )
            );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    相关资源
    最近更新 更多