在PHP中检查变量是否已设置

3
经过10年的PHP编程,我才发现isset()实际上并不好用。根据PHP isset()手册,当变量“已设置”且具有null值时,isset()返回false。我正在使用一个数组,通过阅读和测试代码约2小时后,我通过使用array_key_exists()进行了修复。
但是,对于变量应该使用什么呢?
isset($var) || is_null($var)

如果$var没有设置,会产生NOTICE...empty()也完全不同。正如我所说的,is_null()在未设置变量时会产生NOTICE并返回true!... 好吧,这个也不行。


4
isset($var) && !is_null($var)。在你的例子中,如果 $var 没有被设置,isset 将返回 false,导致执行 is_null(抛出通知)。通过使用 &&,如果 isset 返回 false,表达式将立即返回 false。 - Jonnix
你说得对,看起来我需要睡觉了 :)... 好吧,我正在寻找更好的解决方案... 在大型应用程序中,我们会检查变量的存在性数百或数千次,难道没有比 isset($var) && !is_null($var) 更好的解决方案吗?此外,不可能为此定义一个函数。因为如果变量未设置,PHP会显示错误,并且如果我们通过引用传递,则将null设置为变量... 啊 PHP! - user5483434
@FirstOne empty() 在 null、false、""(空字符串)、0(整数零)、0.0(浮点零)、array() 或 [](空数组)、$var(已声明但没有值的变量)和包含“0”字符的字符串中返回 true。实际上,它根本不应该用于检查变量是否存在。 - user5483434
你忘记描述你想要实现什么了。isset($var)! is_null($var)相同(除了当变量不存在时,is_null()会抛出一个提示)。这意味着isset($var) && ! is_null($var)isset($var)相同。 - axiac
1个回答

0

关于is_nullempty的快速指南可以在这里找到,我曾经经常参考它。

正如您所指出的,is_null是一个抱怨者。唯一不抛出NOTICE的测试方法是检查全局变量数组中是否设置了该变量。您可以通过以下方式进行测试:

// 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,如果过度使用,这会对性能产生显著的影响,包括墙时和内存使用,并且我建议它仅用于调试。
如果您只关心全局变量,可以使用$GLOBALS超级变量。但是,这不会让您访问函数或方法范围内的变量:https://dev59.com/5XRC5IYBdhLWcg3wFM7W#418162 如果您想避免NOTICES以提高性能,则不值得这样做,因为检查的开销大于轻微的性能提升。
我想这真的取决于您的目标是什么。如果您以OOP方式工作,那么您应该能够清楚地知道方法范围内是否设置了变量。否则,最好不要以使undefinedNULL行为不同的方式编码。如果不可能,请考虑利用其他标志来帮助您绕过使用get_undefined_vars
请参阅以下更多有关此主题的信息:

变量设置为null和未定义是否相同以及如何检查差异


这种情况下会忽略变量是全局变量的情况。正确的条件应该是(array_key_exists('var',get_defined_vars()) or array_key_exists('var',$GLOBALS) - Pedro Gimeno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接