PHP变量复制循环奇怪行为
美好的一天。面对一个问题,看起来像这样: 我有一个变量,在循环中重置并重新填充。我将该变量赋值给其他变量,因为它的属性(如$ item-> subitems)。例如,我将$ item收集到$ items的数组中。 每个循环这个变量都被重新设置和重新填充,并且包含不同的数据。 近似示例代码低于:PHP变量复制循环奇怪行为
<?php
$seasons = array(1,2);
$ltabs= array(1);
$all = array(1,2,3,4,5,6,7,8,9,0);
foreach ($ltabs as $tab)
{
//Resetting an object instance
$itm=false;
//Re-Initing object
if (1==1)
{
$itm->height = 1;
$itm->width = 2;
}
else
{
$itm->height = 3;
$itm->width = 4;
}
//And thats where crap happens
//foreach($seasons as $season) //Dont work that way too
for ($y=0;$y<count($seasons);$y++)
{
//Re-initing local array for needed values
$itemz=array();
//$itm->items = array();
for($a=0;$a < count($all);$a++) {
if ($all[$a] % $seasons)//Not tested, supposed to gove ANY dofference in arrays.
{
$itemz[]=$all[$a];
}
}
$itm->items = $itemz;
$rtabs[$season] = $itm;
unset($itemz);
//unset($itemz);
}
}
//Returns crap.
var_dump($rtabs);
?>
但是,当我尝试
<?php
foreach($rtabs as $itm)
{
var_dump($itm->items);
}
?>
我看到所有这些子项包含相同的一组数据。 我已经成功地通过在这个子循环中重新分配整个$ itm变量来打败它。但我想undeerstand - 为什么这样做? 根据this文章 - 垃圾收集器和PHP的写时复制的事情应该初始化,当我重新设置这个$ itemz数组,所以对我所有这看起来很不起眼。 任何帮助,将不胜感激。
在PHP中,对象是通过引用复制的,所以在这条线:
$rtabs[$season] = $itm;
你不放置$itm
对象的副本到您的阵列 - 你复制到它的参考。稍后更改原始对象时,rtabs
阵列中的版本也会发生更改。
如果你想做一个单独的副本,你需要做这样的事情。
$rtabs[$season] = clone $itm;
不能投票,但谢谢。解释得很好。标记为答案。 – 2013-05-12 00:48:53
没问题。很高兴我能帮上忙。 – 2013-05-12 01:07:19
您的示例重现了错误吗?如果没有,请减少真实的代码,直到你只剩下让你描述的事情发生的代码。在这样做的过程中,有99%的机会会发现是什么导致了它,因为你没有仔细检查自己的代码。 – 2013-05-11 23:45:25