来自 isset()
文件:
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 的回答、 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
。)