PHP通过参考错误传递?

时间:2019-06-23 02:56:59

标签: php debugging pass-by-reference

请勿通过引用。我知道.....但是。

有人可以解释这里发生了什么吗?我将尝试解释我的想法,也许这是一个PHP错误。

下面的代码脚本显示了一个示例,其中按引用传递字符串数组(我知道不...),并且如果等于标志,则更改字符串。

该数组完整地来自该foreach循环。该字符串已根据需要进行了更改。所有其他值仍在数组中。

我将更改后的数组不通过引用传递到另一个foreach循环中,并尝试使用与第一个循环中相同的变量名将值简单地推入另一个数组($other_array)中。我假设变量名称将被重置为新值(类似于$ variable =“ new value”)。但是,似乎变量名没有被取消引用。

以某种方式在该循环中,对原始数组进行了更改,并得出了重复的倒数第二个值,但缺少了原始倒数第二个值。对于具有更长且更复杂的数组的其他情况,总是如此。

下面的代码可以使人验证。

1)这是一个PHP错误,是否在第二个foreach循环中使用该变量时未引用该变量?

2)如果任何人都可以提供有关PHP在引用变量方面可能发生的情况的信息,我将很高兴理解。换句话说,为什么foreach会导致数组上的元素重复和丢失?

<?php


$array = ["one", "two", "three"];
$other_array = [];
echo "<pre>";
print_r($array);
echo "</pre>";

foreach($array as &$reference){
  if($reference == "one") $reference = "one_changed";
}

echo "<pre>";
print_r($array);
echo "</pre>";

foreach($array as $reference){
  array_push($other_array, $reference);
}
echo "====changed them but did not push onto array====<br>";

echo "====changed also====";
echo "<pre>";
print_r($array);
echo "</pre>";
echo "====changed also====";
echo "<pre>";
print_r($other_array);
echo "</pre>";

2 个答案:

答案 0 :(得分:2)

不是错误,如果您想重用以前用作参考的变量,则需要执行以下操作:

unset($var);

具体来说,在您的第一个循环之后添加以下一行:

foreach($array as &$reference){
  if($reference == "one") $reference = "one_changed";
}
unset($reference); // <--- this

解决所有问题:

Array
(
    [0] => one
    [1] => two
    [2] => three
)
Array
(
    [0] => one_changed
    [1] => two
    [2] => three
)
====changed them but did not push onto array====<br>====changed also====Array
(
    [0] => one_changed
    [1] => two
    [2] => three
)
====changed also====Array
(
    [0] => one_changed
    [1] => two
    [2] => three
)

还有一件事。数组元素也可以是引用,例如:

$a = 1;

$c=[];
$c[0] =& $a;
$c[1] =& $a;
print_r($c);

$a=2;
print_r($c);

这将输出:

Array
(
    [0] => 1
    [1] => 1
)
Array
(
    [0] => 2
    [1] => 2
)

所以,为了解释代码中到底发生了什么……我宁愿通过。创建一个引用的循环变量,然后将其用作另一个循环中的非引用变量,并将其作为其他数组中的值推送...拧紧它,我放弃。

答案 1 :(得分:0)

这不是“通过引用”,因为这里没有通过。

PHP manual page on foreach中描述了使用foreach&循环中修改数组元素,并警告以后需要取消设置变量。

  

警告

     

$ value的引用和最后一个数组元素即使在   foreach循环。建议通过unset()销毁它。除此以外   您将遇到以下行为: