检查值是否设置为null

Tat*_*nen 82 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
Run Code Online (Sandbox Code Playgroud)

请注意,这$bar是未定义的.

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

if(something($bar)) // returns false;
if(something($foo)) // returns true;
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Hen*_*pel 79

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
Run Code Online (Sandbox Code Playgroud)

  • 好吧,你不需要变量,所以理论上它的一行"if(array_key_exists('foo',get_defined_vars())){}" (4认同)

Joh*_*lia 25

如果您正在处理可能具有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();

?>
Run Code Online (Sandbox Code Playgroud)

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

  • 您可以对array_key_exists()的数组执行相同的操作; (10认同)

Loï*_*ier 13

请参阅测试PHP中变量存在的最佳方法; isset()显然已被打破

 if( array_key_exists('foo', $GLOBALS) && is_null($foo)) // true & true => true
 if( array_key_exists('bar', $GLOBALS) && is_null($bar)) // false &  => false
Run Code Online (Sandbox Code Playgroud)

  • 您引用的代码仅在变量位于全局范围内时才有效. (3认同)

rom*_*own 9

我在寻找数组的解决方案时发现了这个主题。检查是否存在包含 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
Run Code Online (Sandbox Code Playgroud)


nzn*_*nzn 6

我发现这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
Run Code Online (Sandbox Code Playgroud)

更新

从 PHP 7.3 开始,compact()将对未设置的值发出通知,因此不幸的是,这种替代方法不再有效。

如果给定字符串引用未设置的变量,compact() 现在会发出 E_NOTICE 级别错误。以前,此类字符串已被默默地跳过。