一尘不染

测试PHP中变量是否存在的最佳方法;isset()显然已损坏

php

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。)


阅读 375

收藏
2020-05-26

共1个答案

一尘不染

如果您要检查的变量位于全局范围内,则可以执行以下操作:

array_key_exists('v', $GLOBALS)
2020-05-26