美好的一天。面对一个看起来像这样的问题: 我有一个变量,in循环被重置和重新填充。我将该变量分配给其他变量作为其属性(如$ item-> subitems)。 例如,我将$ item收集到$ items数组中。 每个循环此变量都被重新设置并重新填充,并包含不同的数据。 近似示例代码如下:
<?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变量来取得成功。但是我想不自觉 - 它为什么会那样行事? 根据{{3}}文章 - 当我重置这个$ itemz数组时,应该初始化垃圾收集器和php的写时复制内容,所以对我来说这看起来非常不合逻辑。 任何帮助将不胜感激。
答案 0 :(得分:2)
在php中,对象是通过引用复制的,所以在这一行:
$rtabs[$season] = $itm;
您没有将$itm
对象的副本放入数组中 - 您正在复制对它的引用。稍后更改原始对象时,rtabs
数组中的版本也会更改。
如果你想制作一个单独的副本,你需要做这样的事情。
$rtabs[$season] = clone $itm;