从isset()文档:
isset()
isset() will return FALSE if testing a variable that has been set to NULL.
基本上,isset()不检查是否已设置变量,而是检查是否将其设置为NULL。
NULL
鉴于此,实际检查变量是否存在的最佳方法是什么?我尝试了类似的东西:
if(isset($v) || @is_null($v))
(未设置@时有必要避免警告$v),但is_null()有一个类似的问题isset():它会返回未TRUE设置的变量!还显示:
@
$v
is_null()
TRUE
@($v === NULL)
的工作方式与完全相同@is_null($v),所以也可以了。
@is_null($v)
我们应该如何可靠地检查PHP中是否存在变量?
编辑:PHP中未设置的变量与设置为的变量之间显然存在差异NULL:
<?php $a = array('b' => NULL); var_dump($a);
PHP表明$a['b']存在并且具有NULL价值。如果添加:
$a['b']
var_dump(isset($a['b'])); var_dump(isset($a['c']));
您可以看到我在谈论该isset()功能的含糊之处。这是所有这三个的输出var_dump()s:
var_dump()s
array(1) { ["b"]=> NULL } bool(false) bool(false)
进一步编辑:两件事。
一,用例。将数组转换为SQL UPDATE语句的数据,其中数组的键是表的列,而数组的值是要应用于每一列的值。该表的任何列都可以保存一个NULL值,通过NULL在数组中传递值来表示。您 需要 一种区分不存在的数组键和将数组的值设置为NULL;的方法。这就是不更新列的值和将列的值更新为的区别NULL。
UPDATE
其次,Zoredache的答案,array_key_exists()工作正常,我上面的用例和任何全局变量:
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, 我在调用array_key_exists()PHP中最正式的最简便的方式来真正检查变量是否存在。
(我只能想到的其他情况是针对类属性的property_exists(),根据其文档,它的工作方式与之类似array_key_exists(),因为它可以正确地区分未设置和被设置为NULL。)
property_exists()
如果您要检查的变量位于全局范围内,则可以执行以下操作:
array_key_exists('v', $GLOBALS)