从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()``isset()``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)
进一步编辑:两件事。
一,用例。将数组转换为 SQLUPDATE语句的数据,其中数组的键是表的列,数组的值是要应用于每一列的值。表的任何列都可以保存一个值,通过在数组中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)