var设置为null与undefined相同以及如何检查差异

时间:2014-11-11 15:41:38

标签: php null

简单的问题:在php中,var是否设置为null与undefined相同?

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

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

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

is_nullisset完全相反,但只能在您确定已定义var的情况下使用。对于其他所有案例,isset更合适。

要检查nullisset是不合适的,吗?

所以var可以是:

  • 未定义
  • 包含要与is_*函数核对的内容(numericstringarray,...)

3 个答案:

答案 0 :(得分:1)

var设置为NULL与undefined不同。

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

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

答案 1 :(得分:0)

this页面中,它看起来不一样,但表现得像它一样。

检查:

  • undefined:!(isset($var) || array_key_exists('var',get_defined_vars())))
  • null:array_key_exists('var', get_defined_vars()) && is_null($var)
  • 空:isset($var) && empty($var)
  • 内容:isset($var) && !empty($var) +任何其他if_ *具体。

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

检查null:

$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
                    )
                )
            );

答案 2 :(得分:0)

在质疑这个问题时,我经常提到这个网站:
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中):

<table><tr><td>Key</td><td>array_key_exists()</td><td>isset()</td><td>empty()</td><td>is_null()</td></tr><tr><td>$array['null']</td><td>true</td><td>false</td><td>true</td><td>true</td></tr><tr><td>$array['empty']</td><td>true</td><td>true</td><td>true</td><td>false</td></tr><tr><td>$array['zero']</td><td>true</td><td>true</td><td>true</td><td>false</td></tr><tr><td>$array['space']</td><td>true</td><td>true</td><td>false</td><td>false</td></tr><tr><td>$array['character']</td><td>true</td><td>true</td><td>false</td><td>false</td></tr><tr><td>$array['true']</td><td>true</td><td>true</td><td>false</td><td>false</td></tr><tr><td>$array['false']</td><td>true</td><td>true</td><td>true</td><td>false</td></tr><tr><td>$array['undefined']</td><td>false</td><td>false</td><td>true</td><td>true</td></tr></table>

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

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是一种很好的编码习惯。因为你要找的是数据,没有数据就没有数据。