有关is_null
和empty
的快速指南可以找到here,我曾经参考过它。
如您所述,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
和这有显著的性能影响,无论是在墙上,时间和内存使用,如果使用过度,我会建议它应该只用于调试。
如果您对严格的global
变量感兴趣,可以使用$GLOBALS
supervar。但是,这不会让您访问函数或方法范围内的变量:https://stackoverflow.com/a/418162/1301994
如果您尝试避免NOTICES提高性能,这不值得,因为检查的开销大于性能略有提升。
我想这真的很重要你的目标是什么。如果你使用面向对象的方式工作,那么你应该能够清楚地分辨出变量是否被设置或者不在方法的范围内。否则,最好不要以undefined
和NULL
行为不同的方式进行编码。如果这不可行,请考虑使用其他标志来帮助您避开使用get_undefined_vars
。下面
检查多一点的题目
Is var set to null same as undefined and how to check differences
'isset($ VAR)&& is_null($ VAR)'!在你的例子中,如果'$ var'没有设置,'isset'将返回'false',导致执行'is_null'(抛出通知)。通过使用'&&',如果'isset'返回'false',表达式将立即返回false。 –
你是对的,看起来像我需要睡觉:)...嗯,我正在寻找更好的解决方案......在大型应用程序中,我们检查变量是否存在数百或数千次,是否有更好的解决方案isset($ var)&&!is_null($ var)'...此外,为此目的不可能定义一个函数。因为如果变量没有设置,PHP会显示错误,如果我们通过引用传递,则会将null设置为变量。 – user5483434
@FirstOne empty()对null,false,“”(空字符串),0(整数零),0.0(浮点零),array()或[](空数组)返回true,$ var没有价值),和“0”! (包含零字符的字符串)。实际上,它不应该用于检查变量存在。 – user5483434