【问题标题】:PHP - Wrap the "undefined check" trick in a function?PHP - 在函数中包装“未定义检查”技巧?
【发布时间】:2017-05-08 20:07:41
【问题描述】:

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

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

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

...有一个技巧可以用于“紧凑”,它可以让你 判断一个变量是否已经定义,即使它的值为空:

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

这个技巧本身很有效,但是当你尝试将它包装在这样的函数中时它会中断:

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

上面的函数IsDefined总是返回true,不管我传递的是什么形式的未定义变量。 注意 $variable 参数的“&”符号——我通过引用传递,否则 PHP 将抛出“未定义变量”错误。

我怎样才能将上面提到的“未定义检查”技巧转化为一个工作的、可重用的函数?

【问题讨论】:

  • 为什么需要这样做?如果您必须经常这样做以至于需要一个函数,那么您的编码似乎有问题。
  • 它们总是需要检查的全局变量吗?你可以测试一下isset($GLOBALS[$varname])
  • @Barmar 不,它们不会是全局变量,它们将是我将尝试通过引用传递给函数 IsDefined 的变量
  • 如果它们是函数的本地变量,为什么不使用另一个变量来跟踪您是否已分配变量。 $foo_assigned = false; ... $foo = something; $foo_assigned = true;。然后只需测试$foo_assigned
  • @Barmar 我需要这样做的原因是我可以检查是否设置了 $_SESSION 变量,其中 NULL 是可接受的值。目前,如果我检查它是否使用 isset($_SESSION["MyVariable"]) 设置,如果变量为 NULL,它将返回 FALSE,当我需要返回 TRUE 时,因为 NULL 是它设置的值。

标签: php reference null undefined


【解决方案1】:

在 cmets 中,您不需要任何变量的解决方案,只需要会话变量。会话变量不是真正的变量,它们是关联数组的元素。所以你可以使用array_key_exists()函数。

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

那你就可以写了

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

【讨论】:

  • 关于会话变量的注释只是一个例子,我需要它来处理所有类型的变量
  • 然后我回到我的评论,你的编码方式有问题。为什么不知道自己设置了哪些变量?
  • 对于会话变量我可以理解,因为它们是由其他脚本设置的,并且您不知道在脚本运行之前做了什么。但大多数变量都不是那么容易发生的。
猜你喜欢
  • 2010-10-10
  • 1970-01-01
  • 2014-08-24
  • 2017-03-27
  • 2023-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
相关资源
最近更新 更多