2

我对 PHP 的引用(&)有一个奇怪的问题。

假设我有一个看起来像这样的表单:

<form name="form1" id="form1" method="post">
   Name: <input type="text" name="name" /><br />
   Email: <input type="text" name="email" /><br />
   Location: <input type="text" name="location" /><br />
   Phone Number: <input type="text" name="phonenumber" /><br />
</form>

然后我将该表单提交给另一个 PHP 处理程序。处理程序这样做:

foreach($_POST as $name => &$value)
{
    //more code here
}
echo $_POST['phonenumber']; //Returns value of $_POST['location'] for some reason

有人可以向我解释为什么电话号码的价值将是任何位置的价值吗?即使 foreach 内部没有代码,它仍然会这样做。

编辑:

对于那些想知道 foreach 内部发生了什么,或者我为什么要这样做的人,这是因为它是一种将所有提交给处理程序的数据转义的干净方法,而不是手动一次执行一个变量,尤其是当你有动态输入进来。所以像这样:

foreach($_POST as $name => &$value)
{
    $value = preg_replace( "/[<>#$%]/", "", $value);
    $value = preg_replace('/\s\s+/', ' ', $value);
}

除了我上面提到的问题外,它工作得很好。

4

3 回答 3

3

您是否可能会重复它两次,一次有参考,一次没有?它有很大的不同:

$array = [1, 2];

foreach($array as &$value);
echo implode(',', $array); # 1, 2

foreach($array as $value);
echo implode(',', $array); # 1, 1

这是一个演示。解决方法是在循环之间取消设置$value

$array = [1, 2];

foreach($array as &$value);
echo implode(',', $array); # 1, 2
unset($value);

foreach($array as $value);
echo implode(',', $array); # 1, 2
于 2012-08-26T00:53:35.367 回答
1

我很确定您对foreach循环中的引用值感到困惑。您不应该使用它的另一个原因。如果您真的认为至少在循环之后需要unset()value。看看这个例子:http ://codepad.viper-7.com/VCOI2O (注意&第一个转储中的电话号码,它仍然被引用)。

但我认真地认为你应该重新考虑通过参考来做。相反,只需访问循环中需要的项目:

foreach($_POST as $name => $value)
{
    // do with the value what you want
    $_POST[$name] = $value;
}

然而,完全不改变超全球会更好$_POST。当您稍后尝试访问它并且其中的某些内容已更改时,它只会使其他人和您自己感到困惑。

于 2012-08-26T00:33:13.433 回答
0

如果您正在重新分配$value变量,则可能会发生这种情况。例如,在这种情况下,最后一次迭代(对于电话号码)将等于位置值,因为这&意味着如果您分配给它,该值将被更新:

<?php

$i = 0;

foreach($_POST as $name => &$value) {
    if ($i > 2) {
        $value = $temp;
    }
    $i++;

    $temp = $value;
    echo $value;
}

?>
于 2012-08-26T00:32:59.980 回答