2017-05-08 39 views
0

我需要能够在纯粹未定义的变量和空变量之间进行区分。 PHP很难做到这一点。困境在下面的链接解释说:PHP - 在函数中包装“未定义的检查”技巧?

https://stackoverflow.com/a/14309841/3163495

在该链接,还有一招看到如果一个变量是真正的不确定,或简单地设置为NULL:

.. 。还有你可以用“紧凑型”,可以让你 确定一个变量已经被定义,即使其值为null,则使用一个技巧:

var_dump(!!compact('noSuchVariable')); // false 
var_dump(!!compact('nullVariable')); // true 

诀窍本身的伟大工程,但是当你试图将其包装在一个函数像这样它打破:

function IsDefined(& $variable){ 
    return (!!compact('variable')); 
} 

上述功能IsDefined总是返回true,不管是什么形式的不确定变量的我通过它。 请注意$ variable变量的“&”符号 - 我通过引用传递,否则PHP将抛出一个“未定义的变量”错误。

如何将上面提到的“未定义检查”技巧转化为可重用的工作函数?

+2

你为什么要这么做?如果你必须经常这样做以至于你需要一个函数,那么你的代码似乎有问题。 – Barmar

+0

它们是否总是您需要检查的全局变量?你可以测试'isset($ GLOBALS [$ varname])' – Barmar

+0

@Barmar不,它们不会是全局变量,它们将是我将尝试通过引用传递给函数的变量IsDefined – user3163495

回答

1

从评论中,您不需要任何变量的解决方案,仅针对会话变量。会话变量不是实数变量,它们是关联数组的元素。所以你可以使用array_key_exists()函数。

function sessionVarDefined($varname) { 
    return array_key_exists($varname, $_SESSION); 
} 

然后,你可以写

if (sessionVarDefined('MyVariable') { 
    ... 
} 
+0

有关会话变量的评论只是一个例子,我需要它来处理所有类型的变量 – user3163495

+0

然后我回到我的评论你编码的方式有些问题。你为什么不知道你设置了哪些变量? – Barmar

+1

我可以理解它的会话变量,因为它们是由其他脚本设置的,并且您不知道在脚本运行之前完成了什么。但是大多数变数并非如此飞行。 – Barmar