检查PHP中是否设置了变量

检查PHP中是否设置了变量,php,variables,isset,Php,Variables,Isset,经过10年的PHP编程,刚才我发现isset()一点都不好,根据,isset()当变量“设置”并且有一个null值时返回false 嗯,我当时正在使用一个数组,我通过array\u key\u exists()修复了这个问题,仅仅在读取和测试了大约2个小时的代码之后 但是变量使用什么呢 isset($var) || is_null($var) 这会在未设置$var时发出通知。。。empty()也完全在另一个世界中。正如我所说,is_null()注意未设置的变量并返回true!!。。。好吧,这本

经过10年的PHP编程,刚才我发现
isset()
一点都不好,根据,
isset()
当变量“设置”并且有一个
null
值时返回false

嗯,我当时正在使用一个数组,我通过
array\u key\u exists()
修复了这个问题,仅仅在读取和测试了大约2个小时的代码之后

但是变量使用什么呢

isset($var) || is_null($var)

这会在未设置$var时发出通知。。。empty()也完全在另一个世界中。正如我所说,is_null()注意未设置的变量并返回true!!。。。好吧,这本书也出版了。

关于
的快速指南是空的,可以找到
空的,我以前经常引用它

正如您所指出的,
是空的
是一个抱怨者。在不发出通知的情况下测试此操作的唯一方法是检查变量是否在全局vars数组中设置。您可以通过以下方式进行测试:

// Is Set (to anything)
if(!(isset($var) || array_key_exists('var',get_defined_vars()))){ /* ... */ }
// Set and Null
if(!(is_null($var) || array_key_exists('var',get_defined_vars())))) { /* ... */ }

// Etc
这里的问题是,您使用的是
get_defined_vars
,如果过度使用,这会对性能产生重大影响,包括墙时间和内存使用,我建议只用于调试

如果您对严格意义上的
global
变量感兴趣,可以使用
$GLOBALS
超变量。但是,这不允许您访问函数或方法范围内的变量:

如果您试图避免通知以提高性能,这是不值得的,因为检查的开销大于轻微的性能提升

我想你的目标是什么真的很重要。如果您是以面向对象的方式工作的,那么您应该能够相当清楚地知道是否在方法的范围内设置了变量。否则,最好不要以
undefined
NULL
行为不同的方式编码。如果这是不可能的,考虑使用其他标志来帮助您绕过使用<代码> GETSUnDealdEdVARS<代码> > < /P> 有关此主题的更多信息,请查看以下内容:


isset($var)&&!为空($var)
。在您的示例中,如果未设置
$var
,则
isset
将返回
false
,导致执行
为null
(抛出通知)。通过使用
&&
,如果
isset
返回
false
,表达式将立即返回false。您是对的,看起来我需要睡眠:)。。。我在寻找更好的解决方案。。。在大型应用程序中,我们检查变量的存在数百次或数千次,难道没有比
isset($var)&&更好的解决方案吗!为空($var)
。。。此外,不可能为此目的定义函数。因为若未设置变量,PHP会显示错误,若通过引用传递,则会将null设置为变量。。。啊@FirstOne empty()在null、false、“(空字符串)、0(整数零)、0.0(浮点零)、array()或[](空数组)、$var(声明但没有值的变量)和“0”时返回true!!!(包含零个字符的字符串)。实际上,它根本不应该用于检查变量是否存在。您忘记了描述您想要实现的目标。(当变量不存在时,
引发的通知除外)。这意味着
isset($var)&!is_null($var)
与isset($var)
相同。这忽略了变量为全局变量的情况。正确的条件是
(array\u key\u exists('var',get\u defined\u vars())或array\u key\u exists('var',$GLOBALS)