【问题标题】:Test for NULL value in a variable that may not be set测试可能未设置的变量中的 NULL 值
【发布时间】:2011-01-18 00:36:48
【问题描述】:

考虑到:

  • isset() 构造如果设置了变量而不是 NULL,则返回 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');

?>

【问题讨论】:

  • 把这个问题读几遍……他要找的东西并不明显,而且比最初看起来要困难得多。

标签: php


【解决方案1】:

我使用了一个自己创建的函数来轻松检查,记住它会触发 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;
    }

【讨论】:

  • 可以使用适当的 array_filter()、is_null 等来清理此代码,但如果不对其进行测试,我不会在这里执行此操作,所以我将把它留在这里作为一个工作示例。
【解决方案2】:

我会在这里争辩说,任何需要这种比较的代码都会导致其语义错误; NULL 语言中的未设置值,无法直接区分两者。

【讨论】:

  • (例如)未设置 $phone_number(用户没有提供他的号码)和代码中的 $fone_number 之类的错字之间存在差异。我发现以不同的方式处理这两种情况并没有错,恕我直言,这比 PHP 产生的差异很小。看看 SQL:NULL 值的行和不存在的行是不一样的。
  • 当然有。然而,尝试向 PHP 解释这一点。甚至不要让我开始无法捕捉简单的错误,例如拼写错误(读取未设置的变量)或传递错误数量的参数......
  • 这里 - 现在第二句话的重音要高很多。
【解决方案3】:

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

  • 依赖isset,因为它为null 的变量返回false
  • 使用$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);


几点注意事项:

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

但请注意,如果您关心性能,这可能不是一个好主意:isset 是一种语言结构,而且速度很快——而调用get_defined_vars 可能要慢得多^^

【讨论】:

  • 出色的分析。实际上,使用 @ 看起来是最好的选择。
  • 谢谢 :-) ;;;实际上,我想说通常没有必要区分 "doesn't exist""is null" :在大多数情况下,使用@987654339 @ 应该没问题。
【解决方案4】:
$result = array_key_exists('varname', get_defined_vars());

【讨论】:

  • 可能不是最佳但机智
【解决方案5】:
if (isset($var) && (is_null($var)) {
    print "\$var is null";
}

这应该可以解决问题。

【讨论】:

  • 当 $var 为 NULL 时,此条件为 FALSE
  • 使用print '$var is null' 消除了转义 $ 的需要,因为不评估单引号。它仍然是一个字符串值
猜你喜欢
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 2016-08-11
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
相关资源
最近更新 更多