检查值是否设置为null

时间:2010-09-27 11:18:27

标签: php null isset

我需要检查值是否定义为任何值,包括null。 isset将null值视为未定义,并返回false。以下面的例子为例:

$foo = null;

if(isset($foo)) // returns false
if(isset($bar)) // returns false
if(isset($foo) || is_null($foo)) // returns true
if(isset($bar) || is_null($bar)) // returns true, raises a notice

请注意,$bar未定义。

我需要找到满足以下条件的条件:

if(something($bar)) // returns false;
if(something($foo)) // returns true;

有什么想法吗?

10 个答案:

答案 0 :(得分:75)

IIRC,您可以使用get_defined_vars()

$foo = NULL;
$vars = get_defined_vars();
if (array_key_exists('bar', $vars)) {}; // Should evaluate to FALSE
if (array_key_exists('foo', $vars)) {}; // Should evaluate to TRUE

答案 1 :(得分:24)

如果您正在处理可能具有NULL值的对象属性,则可以使用:property_exists()而不是isset()

<?php

class myClass {
    public $mine;
    private $xpto;
    static protected $test;

    function test() {
        var_dump(property_exists($this, 'xpto')); //true
    }
}

var_dump(property_exists('myClass', 'mine'));   //true
var_dump(property_exists(new myClass, 'mine')); //true
var_dump(property_exists('myClass', 'xpto'));   //true, as of PHP 5.3.0
var_dump(property_exists('myClass', 'bar'));    //false
var_dump(property_exists('myClass', 'test'));   //true, as of PHP 5.3.0
myClass::test();

?>
  

与isset()相反,即使属性值为NULL,property_exists()也返回TRUE。

答案 2 :(得分:12)

请参阅Best way to test for a variable's existence in PHP; isset() is clearly broken

 if( array_key_exists('foo', $GLOBALS) && is_null($foo)) // true & true => true
 if( array_key_exists('bar', $GLOBALS) && is_null($bar)) // false &  => false

答案 3 :(得分:3)

我发现compact是一个忽略未设置变量的函数,但是对设置为null的变量起作用,所以当你有一个大的局部符号表时,我会想你可以更有效率使用array_key_exists('foo', get_defined_vars())

检查array_key_exists('foo', compact('foo'))的解决方案
$foo = null;
echo isset($foo) ? 'true' : 'false'; // false
echo array_key_exists('foo', compact('foo')) ? 'true' : 'false'; // true
echo isset($bar) ? 'true' : 'false'; // false
echo array_key_exists('bar', compact('bar')) ? 'true' : 'false'; // false

<强>更新

自PHP 7.3起compact()将发出未设置值的通知,因此不幸的是,此替代方案不再有效。

  如果给定的字符串引用了未设置的变量,

compact()现在会发出E_NOTICE级别错误。以前,这样的字符串是默默无闻的   跳过。

答案 4 :(得分:1)

以下编写为PHP扩展的代码相当于array_key_exists($ name,get_defined_vars())(感谢Henrik和Hannes)。

// get_defined_vars()
// https://github.com/php/php-src/blob/master/Zend/zend_builtin_functions.c#L1777
// array_key_exists
// https://github.com/php/php-src/blob/master/ext/standard/array.c#L4393

PHP_FUNCTION(is_defined_var)
{

    char *name;
    int name_len;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
        return;
    }

    if (!EG(active_symbol_table)) {
        zend_rebuild_symbol_table(TSRMLS_C);
    }

    if (zend_symtable_exists(EG(active_symbol_table), name, name_len + 1)) {
        RETURN_TRUE;
    }

}

答案 5 :(得分:0)

您可以使用is_nullempty代替isset()。如果变量不存在,则Empty不会打印错误消息。

答案 6 :(得分:0)

这里有一些使用xdebug的愚蠢的解决方法。 ; - )

function is_declared($name) {
    ob_start();
    xdebug_debug_zval($name);
    $content = ob_get_clean();

    return !empty($content);
}

$foo = null;
var_dump(is_declared('foo')); // -> true

$bla = 'bla';
var_dump(is_declared('bla')); // -> true

var_dump(is_declared('bar')); // -> false

答案 7 :(得分:0)

冒着被否决的风险,我什至不会打扰 - 显然 PHP 希望您在逻辑上将 NULL 和 Undef 视为相同。我只是用它运行 - 我创建了一个函数:

bool isEmpty(& $davar);

检查 isset(处理 null 和 undef)、"" 和 array()。请注意,这是故意不处理虚假信息;只是空的。 & 'reference-izer' 允许在没有错误消息的情况下传递变量,即使未定义,并且如果您检查 isset 并首先返回 false,则您可以对 "" 和 array() 进行下一次检查而不会出错。

下一个函数利用了这个函数,并在你会用到的地方使用

$davar || some-default.

那就是:

mixed defaultForEmpty(& $daVar, $default);

只有条件:

if (isEmpty($daVar)) 
    return $default;
else
    return $daVar;

顺便说一句,这些适用于对象引用、数组索引、$_GET、$_POST 等。

答案 8 :(得分:0)

我在寻找数组的解决方案时发现了这个主题。检查是否存在包含 NULL 的数组元素,此构造对我有帮助

    $arr= [];
    $foo = 'foo';
    $arr[$foo]= NULL;
    if (array_key_exists('bar', $arr)) {}; // Should evaluate to FALSE
    if (array_key_exists('foo', $arr)) {}; // Should evaluate to TRUE
    if (array_key_exists($foo, $arr)) {}; // Should evaluate to TRUE

答案 9 :(得分:-3)

is_null($bar)返回true,因为它根本没有值。或者,您可以使用:

if(isset($bar) && is_null($bar)) // returns false

检查是否已定义$bar,并且只有在以下情况下才会返回true:

$bar = null;
if(isset($bar) && is_null($bar)) // returns true