测试可能未设置的变量中的NULL值

时间:2010-02-17 19:13:35

标签: php

考虑到:

  • 如果设置了变量而不是NULL
  • ,则isset()构造返回TRUE
  • 如果未设置变量,is_null()函数将发出警告

有没有办法测试变量是否存在,无论是否为NULL,而不使用@运算符来抑制通知?


修改

与你的第一个回复一起,我一直在考虑这个问题,我得出结论,检查get_defined_vars()是区分变量设置为NULL和未设置变量的唯一方法。 PHP似乎没什么区别:

<?php

$exists_and_is_null = NULL;

// All these are TRUE

@var_dump(is_null($exists_and_is_null));
@var_dump(is_null($does_not_exist));

@var_dump($exists_and_is_null===NULL);
@var_dump($does_not_exist===NULL);

@var_dump(gettype($exists_and_is_null)=='NULL');
@var_dump(gettype($does_not_exist)=='NULL');

?>

5 个答案:

答案 0 :(得分:5)

$result = array_key_exists('varname', get_defined_vars());

答案 1 :(得分:0)

正如您已经发现的那样,您不能:

  • 依赖于isset,因为它会为false的变量返回null
  • 使用$not_exists===null,因为它会发出通知。


但是你可以使用以下组合:


例如:

$exists_and_null = null;
$exists_and_not_null = 10;

$defined_vars = get_defined_vars();

// true
var_dump(array_key_exists('exists_and_null', $defined_vars) 
    && $defined_vars['exists_and_null']===null);

// false
var_dump(array_key_exists('exists_and_not_null', $defined_vars) 
    && $defined_vars['exists_and_not_null']===null);

// false
var_dump(array_key_exists('not_exists', $defined_vars) 
    && $defined_vars['not_exists']===null);


几个笔记:

  • 在第一种情况下,变量exists =&gt; get_defined_vars返回的列表中有一个条目,因此评估条件的第二部分
    • 并且条件的两个部分都是true
  • 在第二种情况下,变量也存在,但是为空
    • 表示条件的第一部分为true,但第二部分为false
    • 因此整个表达式为false
  • 在第三种情况下,变量不存在,
    • 表示条件的第一部分是false
    • 并且不评估条件的第二部分 - 这意味着它不会发出通知。

但请注意,这可能不是一个好主意,如果你关心表演:isset是一种语言结构,并且很快 - 而调用get_defined_vars可能要慢得多^^

答案 2 :(得分:0)

我使用自己创建的函数来轻松检查,请记住它会触发PHP警告(我在开发时只监视E_ERROR)。

    function isNullOrEmpty( $arg )
    {
        if ( !is_array( $arg ) )
        {
            $arg = array( $arg );
        }

        foreach ( $arg as $key => $value )
        {
            if( $value == null || trim($value) == "" )
            {
                return true;
            }
        }
        return false;
    }

答案 3 :(得分:0)

我认为,任何需要这种比较的代码都会使其语义错误; NULL 语言中的未设置值,没有直接的方法来区分两者。

答案 4 :(得分:-2)

if (isset($var) && (is_null($var)) {
    print "\$var is null";
}

这应该可以解决问题。