2015-12-21 62 views
1

设置经过10年的PHP编程的,刚才我发现isset()是一点都不好,根据PHP isset() manualisset()返回变量时“设置”,具有null值为false。检查,如果一个变量在PHP

那么,我正在处理一个数组,我在大约2小时的阅读和测试代码之后,通过array_key_exists()修复了这个问题。

但变量使用什么?

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

这使得通知时没有设置$ VAR ...空()完全是在另一个世界了。正如我所说的,is_null()通知没有设置变量,并返回true !! ......这个也没有了。

+4

'isset($ VAR)&& is_null($ VAR)'!在你的例子中,如果'$ var'没有设置,'isset'将返回'false',导致执行'is_null'(抛出通知)。通过使用'&&',如果'isset'返回'false',表达式将立即返回false。 –

+0

你是对的,看起来像我需要睡觉:)...嗯,我正在寻找更好的解决方案......在大型应用程序中,我们检查变量是否存在数百或数千次,是否有更好的解决方案isset($ var)&&!is_null($ var)'...此外,为此目的不可能定义一个函数。因为如果变量没有设置,PHP会显示错误,如果我们通过引用传递,则会将null设置为变量。 – user5483434

+0

@FirstOne empty()对null,false,“”(空字符串),0(整数零),0.0(浮点零),array()或[](空数组)返回true,$ var没有价值),和“0”! (包含零字符的字符串)。实际上,它不应该用于检查变量存在。 – user5483434

回答

0

有关is_nullempty的快速指南可以找到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提高性能,这不值得,因为检查的开销大于性能略有提升。

我想这真的很重要你的目标是什么。如果你使用面向对象的方式工作,那么你应该能够清楚地分辨出变量是否被设置或者不在方法的范围内。否则,最好不要以undefinedNULL行为不同的方式进行编码。如果这不可行,请考虑使用其他标志来帮助您避开使用get_undefined_vars。下面

检查多一点的题目

Is var set to null same as undefined and how to check differences