从isset()
docs人中:
isset() will return FALSE if testing a variable that has been set to NULL.
基本上,isset()
根本不判断变量是否被设置,而是判断它是否被设置为NULL
以外的任何值.
鉴于此,判断变量是否存在的最佳方法是什么?我试过这样的方法:
if(isset($v) || @is_null($v))
(当未设置$v
时,@
是避免警告所必需的),但is_null()
与isset()
有一个类似的问题:它在未设置的变量上返回TRUE
!而且似乎:
@($v === NULL)
和@is_null($v)
差不多,所以也算出来了.
我们应该如何可靠地判断PHP中是否存在变量?
编辑:在PHP中,未设置的变量和设置为NULL
的变量之间有明显的区别:
<?php
$a = array('b' => NULL);
var_dump($a);
PHP显示$a['b']
存在,并且有一个NULL
值.如果您添加:
var_dump(isset($a['b']));
var_dump(isset($a['c']));
您可以看到我所说的isset()
函数的模糊性.下面是这三个var_dump()s
的输出:
array(1) {
["b"]=>
NULL
}
bool(false)
bool(false)
进一步编辑:两件事.
第一,用例.将数组转换为SQL UPDATE
语句的数据,其中数组的键是表的列,数组的值是应用于每列的值.表中的任何列都可以包含NULL
值,通过在数组中传递NULL
值来表示.您可以找到一种方法来区分不存在的数组键和设置为NULL
的数组值;这就是不更新列的值和将列的值更新为NULL
之间的区别.
其次,对于我上面的用例和任何全局变量,Zoredache's answer,array_key_exists()
都可以正常工作:
<?php
$a = NULL;
var_dump(array_key_exists('a', $GLOBALS));
var_dump(array_key_exists('b', $GLOBALS));
输出:
bool(true)
bool(false)
因为这可以正确地处理几乎所有我能看到的变量,在不存在的变量和设置为NULL
I'm calling 101 the official easiest way in PHP to truly check for the existence of a variable的变量之间存在任何歧义.
(我唯一能想到的另一种情况是类属性,其中有property_exists()
,根据its docs,其工作原理与array_key_exists()
类似,因为它正确区分了未设置和设置为NULL
.)