PHP错误还是我对语言的误解?

PHP错误还是我对语言的误解?,php,Php,这是我不理解的代码(作为输出) PS:我在下面运行它: php -v PHP 5.6.11-1ubuntu3.1 (cli) Copyright (c) 1997-2015 The PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies 它更多的是

这是我不理解的代码(作为输出)

PS:我在下面运行它:

php -v
PHP 5.6.11-1ubuntu3.1 (cli) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies

它更多的是一个功能,它记录在手册页中

警告 即使在foreach循环之后,$值和最后一个数组元素的引用仍然保留。建议通过unset()将其销毁

主页上有一些相关的评论,下面是其中之一


有关此情况如何发生的详细信息

由于第一个循环,
$y
仍然是对最后一个数组项的引用,因此每次都会覆盖它

在循环中使用引用时,建议使用
unset()
函数销毁它

例如,当您创建一个
Global
变量时,这意味着您正在创建一个引用


还有一个例子,当我们在一个对象中使用
$this
关键字时,我们正在创建这个对象的引用,而不是再次复制

我想你会得到这样的东西

第一个FOREACH 测试1测试2 第二个FOREACH 测试1 测试1

因为您在第一个foreach中使用了&和您的$y,所以您将$y作为对$x的引用,整个数组$x。$y将一直作为参考,直到您取消设置它。
所以
因为在下一个foreach中重用了$y,所以PHP将$x设置两次,使$y的第一个元素为“test1”$x将是['test1','test1']


使用引用时一定要小心,当不再需要引用时一定要将其取消设置。

在第一个foreach语句之后,您的
$y
指向最后一个数组项:

$x = ['test1', 'test2', 'test3', 'test4'];
$y =& $x[3];
无论何时为
$y
赋值,原始数组都将被修改

当第二个foreach开始时,在每次迭代中,
$x
中的下一个值被放入
$y
。因此,在每次迭代中,原始数组将如下所示:

// first iteration
$x = ['test1', 'test2', 'test3', 'test1'];
// second iteration
$x = ['test1', 'test2', 'test3', 'test2'];
// third iteration
$x = ['test1', 'test2', 'test3', 'test3'];
// fourth iteration
$x = ['test1', 'test2', 'test3', 'test3'];

好吧,我想是这样的:

当第一个循环完成时。数组中的最后一个元素仍然使用变量
$y

在完成第一个循环时,可以这样考虑阵列:

['test1'、'test2'、'test3'和'test4']

请注意,我在最后一个元素中插入了一个
&
,因为它引用了变量
$y

现在,当第二个循环开始时。
$x
中的每个元素将被引用为
$y
,请记住,在数组
$x
中,最后一个元素仍由循环中的变量
$y
引用

因此,在第二个循环的每次迭代中修改数组
$x
中的最后一个元素。作为
$y


['test1'、'test2'、'test3'、&'test1']@John,回显参数如何修改它?而且,从我在运行代码时看到的情况来看,第二个循环执行test1/test1。如果他们不是那么讨厌的话,OP可能会提出一些问题:-)约翰。。你不理解这个问题。请运行代码,你就会明白我的意思了。PS:在这样的代码中,新行根本没有追加,任何地方的$y变量都没有变化。正如输出所示,数组的最后一个元素受到影响@如果你有一个很好的解释,我们很乐意听到。@TimBiegeleisen。。问题仍然存在。。为什么会出现这个问题?我在代码中遇到了它,花了30分钟,直到我意识到代码不是问题所在。@Tim,我实际上没有答案,不管是好是坏:-)回音会改变数据似乎很奇怪,这就是我询问John的原因。不管怎么说,下面的答案似乎很清楚发生了什么。这根本不是
echo
,而是
as
。我怀疑你有正确的doc链接,但可以用外行的话解释这会导致
'test3'
在OP的输出中出现两次?我引用了一个比我能给出的解释要好得多的解释。有人用4个元素编辑了我的问题后,似乎最后一个重复了,而不是我最初认为的第一个。OP不是问该做什么,他是问对所描述的行为的解释。@DanFromGermany:我已经根据我的知识和研究进行了更新。谢谢你的解释!
$x = ['test1', 'test2', 'test3', 'test4'];
$y =& $x[3];
// first iteration
$x = ['test1', 'test2', 'test3', 'test1'];
// second iteration
$x = ['test1', 'test2', 'test3', 'test2'];
// third iteration
$x = ['test1', 'test2', 'test3', 'test3'];
// fourth iteration
$x = ['test1', 'test2', 'test3', 'test3'];