1

我知道在 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.

提前感谢您的澄清。

4

2 回答 2

2

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

首先,当你$v1 = $_POST['v1']; $v1现在做的是独立的$_POST['v1']变量。由于您制作了副本$v1,因此不会反映任何更改。$_POST['v1']

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

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

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

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

于 2012-04-19T00:05:11.017 回答
1

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

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

于 2012-04-19T00:08:38.867 回答