是VAR设置为null一样不确定的,如何检查的差异(Is var set to null same

2019-10-21 06:13发布

简单的问题:在PHP中,是VAR设置为null一样不确定的?

此外,什么是检查是无功无效简单的方法?

如何使用此功能,而不会破坏代码,例如。 通过设置在东西可以被设置为配置阵列可选null

如果支票nullis_null如果没有定义VAR它可能会破坏代码。

is_null是完全相反的isset ,但只有且仅当您确定VAR是指可以使用。 富勒所有其他案件看起来是isset更合适。

并检查nullisset是unapropriate, 是吗

所以VAR可以是:

  • 未定义
  • 空值
  • 与内容检查与is_*功能( numericstringarray ,...)

Answer 1:

VAR设置为NULL是不一样的定义。

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

此代码演示混乱可如何产生的,因为这将导致消息“该变量是NULL”被显示在,但它也将产生一个“未定义的变量”的通知。 (假设$ undefinedvariable实际上是不确定的,当然!)



Answer 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 ):

<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 。 因为你正在寻找的是数据,没有数据没有数据。



Answer 3:

在这个网页它看起来不完全一样,但就像它。

去检查:

  • 未定义: !(isset($var) || array_key_exists('var',get_defined_vars())))
  • 空: array_key_exists('var', get_defined_vars()) && is_null($var)
  • 空: isset($var) && empty($var)
  • 内容: isset($var) && !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
                    )
                )
            );


文章来源: Is var set to null same as undefined and how to check differences
标签: php null