【问题标题】:PHP: function argument reference for request dataPHP:请求数据的函数参数参考
【发布时间】:2012-04-30 11:24:47
【问题描述】:

我知道在 PHP 中,当您希望函数参数引用目标变量时,我们使用 & 符号 & 符号。但我无法弄清楚它在以下场景中是否仍然有效和可靠(从请求中收集变量)。

$v1 = $_POST['v1'];

function filled(&$var) {
    return isset($var) && !empty($var);
}

if (!filled($v1)) // etc.

甚至在这种情况下:

$v1 = $_POST['v1'];
$v2 = $_POST['v2'];

function filled() {
    $args = &func_get_args(); // does this even take the references and not the values?
    foreach ($args as &$arg) {
        if (empty($arg) || !isset($arg)) return false;
    }
    return true;
}

if (!filled($v1, $v2)) // etc.

提前感谢您的澄清。

【问题讨论】:

  • 对不起,我没看懂,为什么你的例子需要参考?
  • 其实你是对的。无论如何,您认为第二个函数的第一行至少可以完成它的工作吗?
  • 注意:!empty() 包含 isset(),所以不需要两者都做。
  • 对于 0falseempty 不返回 true 吗?这对我来说是一堵大墙(也适用于我自己的例子)。
  • @jack - PHP 使用写时复制语义,因此在这些示例中使用引用对内存使用没有影响。

标签: php function post pass-by-reference


【解决方案1】:

它仍然有效,因为引用不关心变量是用户定义的还是来自 PHP 超全局变量,但您的第一个示例存在一些问题。

首先,当您执行 $v1 = $_POST['v1']; 时,$v1 现在独立于 $_POST['v1'] 变量。对$v1 的任何更改都不会反映在$_POST['v1'] 中,因为您制作了副本。

您可以这样做:$v1 = &$_POST['v1']; 创建对它的引用。

其次,您在函数中对isset 的调用将始终返回true。 isset 是一种特殊的语言结构,而不是函数。如果未设置$_POST['v1'],则在将$_POST['v1'] 分配给$v1 后,$v1 仍将设置(但将为空)。

另外,据我所知,func_get_args() 不支持引用,它返回的所有值都是原始值的副本。

这是否解决了您的一些问题?如果没有,请随时询问您想要澄清的任何内容。

【讨论】:

  • 这是一个很好的说明,谢谢。那么对于第二个示例,使用数组作为唯一参数会解决该引用问题吗?
  • 是的,对于第二个示例,我认为您需要传递数组并直接接收它,因为 func_get_args 不允许您引用实际参数。 mitko at edabg dot com 对 php.net/func_get_args 有一条评论,它显示了如何获取引用,但它有点 hackish,我不会在任何已发布的代码中使用它。
【解决方案2】:

场景 1:它不会做你想做的事,因为 $var 将始终设置为函数参数。但是,如果您想检查此参数是否不包含空值(null、false 等),您可以执行empty($var)。无需在那里使用&。 您想要的可以作为!empty($_POST['v1') 完成。如果您将某些东西传递给函数,它必须具有价值,因此在函数中使用isset() 不会做任何事情。在外面使用array_key_existsisset()empty()

场景 2:func_get_args() 不需要 &,放弃它。 $arg 也不需要它并且将始终设置,因此 isset() 检查是无用的,尽管只有 empty() 有用。如上,如果要查看数组键是否存在,请使用isset($_POST['v1'])!empty($_POST['v1'])

【讨论】:

  • 非常感谢。那是一些有价值的信息。
猜你喜欢
  • 1970-01-01
  • 2017-10-14
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 2016-11-27
相关资源
最近更新 更多