PHP-在函数中包装“未定义检查”技巧?

PHP-在函数中包装“未定义检查”技巧?,php,reference,null,undefined,Php,Reference,Null,Undefined,我需要能够在PHP中区分纯未定义的变量和空变量。PHP使得这一点很难做到。下面的链接解释了这一困境: 在该链接中,有一个技巧可以查看变量是否真正未定义,或者只是设置为NULL: …您可以使用compact的一个技巧 确定变量是否已定义,即使其值为空: var_dump(!!compact('noSuchVariable')); // false var_dump(!!compact('nullVariable')); // true 这个技巧本身非常有效,但当您尝试将其封装到如下函数中时,它就

我需要能够在PHP中区分纯未定义的变量和空变量。PHP使得这一点很难做到。下面的链接解释了这一困境:

在该链接中,有一个技巧可以查看变量是否真正未定义,或者只是设置为NULL:

…您可以使用compact的一个技巧 确定变量是否已定义,即使其值为空:

var_dump(!!compact('noSuchVariable')); // false
var_dump(!!compact('nullVariable')); // true
这个技巧本身非常有效,但当您尝试将其封装到如下函数中时,它就会崩溃:

function IsDefined(& $variable){
    return (!!compact('variable'));
}
无论传递何种形式的未定义变量,上述函数IsDefined始终返回true。 请注意$variable参数旁边的&symbol,我是通过引用传递的,否则PHP将抛出一个未定义的变量错误


如何将上面提到的未定义的检查技巧应用到可重用的工作函数中?

从注释中可以看出,您不需要任何变量的解决方案,只需要会话变量。会话变量不是实变量,它们是关联数组的元素。所以你可以使用这个函数

function sessionVarDefined($varname) {
    return array_key_exists($varname, $_SESSION);
}
然后你就可以写了

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

你为什么要这么做?如果你不得不经常这样做,以至于你需要一个函数,那么你的编码似乎有问题。你需要检查的总是全局变量吗?您可以测试isset$GLOBALS[$varname]@Barmar否它们不是全局变量,它们将是我尝试通过引用传递到函数的变量IsDefined如果它们是函数的局部变量,为什么不使用另一个变量来跟踪您是否已分配该变量$foo_assigned=false$foo=某物$foo_assigned=true;。然后只需测试$foo_assigned.@Barmar我需要能够这样做的原因是,我可以检查是否设置了$_会话变量,其中NULL是一个可接受的值。目前,如果我检查是否使用isset$\u SESSION[MyVariable]设置它,当我需要返回TRUE时,如果变量为NULL,它将返回FALSE,因为NULL是设置它的值。关于SESSION变量的注释只是一个示例,我需要它来处理所有类型的变量。然后我回到我的评论,你的编码方式有问题。为什么你不知道你设置了哪些变量?我可以理解会话变量,因为它们是由其他脚本设置的,你不知道在脚本运行之前做了什么。但大多数变量并不是那么轻浮。