【问题标题】:Passing unset variables to functions将未设置的变量传递给函数
【发布时间】:2011-07-29 22:03:32
【问题描述】:

我的代码:

function Check($Variable, $DefaultValue) {
    if(isset($Variable) && $Variable != "" && $Variable != NULL) {
        return $Variable;
    }
    else {
        return $DefaultValue;
    }
}

$a = Check(@$foo, false);
$b = Check(@$bar, "Hello");

//$a now equals false because $foo was not set.
//$b now equals "Hello" because $bar was not set.
  1. 当变量不存在并传递给函数(抑制错误)时,实际传递的是什么?
  2. 此函数是否存在任何未定义的行为?
  3. 有没有更好的方法来包装变量存在的测试并从函数中提供默认值?
  4. isset() 在测试变量时在后台检查什么?

编辑:

默认值是用户定义的。有时是数字,有时是字符串。

【问题讨论】:

  • 如果您的函数正在通过引用查找某些内容,您可以传递一个未设置的变量。唯一的缺点是它不能接受表达式,只能接受变量。 function Check(&$Variable, $DefaultValue) { ...

标签: php variables exists


【解决方案1】:

在声明函数时,可以通过在变量前面加上 & 来通过引用将变量传递给方法。然后您可以检查它是否在函数内部设置,而不必担心在传递未设置的值时抑制警告。

function Check(&$Variable, $DefaultValue) {
    if(isset($Variable) && $Variable != "" && $Variable != NULL) {
        return $Variable;
    }
    else {
        return $DefaultValue;
    }
}

$a = Check($foo, false);
$b = Check($bar, "Hello");

【讨论】:

    【解决方案2】:

    当一个变量不存在并且是 传递给函数(抑制 错误)实际传递了什么?

    在这种情况下,您尝试从不存在的变量中读取
    所以,你得到了null——它被传递给了函数。


    是否有任何未定义的行为 这个功能可以展示吗?

    我没有看到 - 除了使用 @ 运算符不是一个很好的做法。

    【讨论】:

      【解决方案3】:
      1. NULL 被传递,通知错误被提出。
      2. 不,函数只看到它的参数(它不关心它是如何被调用的)
      3. 您可以轻松指定默认值 - function func($mandatory, $optional = 'default value');
      4. 在其参数上设置函数是没有意义的,因为参数已经在函数签名中设置。

      【讨论】:

      • 是否有必要将默认值参数放在参数列表的末尾,就像在 C 中一样?
      • isset 为带有null 的变量返回false:$var = null; var_dump(isset($var));
      • 谢谢。默认值是用户定义的。有时是数字,有时是字符串。
      • @Dexter,否则这样做是不合逻辑的,因为如果你不想这样做,你仍然必须传递可选参数,但你必须传递一些在函数签名。
      【解决方案4】:
      1. null 将通过
      2. PHP AFAIK 中没有未定义的行为
      3. 通常使用empty($var) 进行测试,例如:Check(empty($foo) ? null : $foo),尽管根据具体情况isset 可能更合适
      4. isset 所做的正是documented——它测试范围内是否存在这样的变量,并且其值与null 不同

      【讨论】:

        猜你喜欢
        • 2013-04-14
        • 1970-01-01
        • 2015-10-22
        • 2020-07-28
        • 1970-01-01
        • 1970-01-01
        • 2015-04-06
        • 2020-12-04
        相关资源
        最近更新 更多