php变量复制循环奇怪的行为

时间:2013-05-11 23:38:55

标签: php

美好的一天。面对一个看起来像这样的问题: 我有一个变量,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的写时复制内容,所以对我来说这看起来非常不合逻辑。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

在php中,对象是通过引用复制的,所以在这一行:

$rtabs[$season] = $itm;

您没有将$itm对象的副本放入数组中 - 您正在复制对它的引用。稍后更改原始对象时,rtabs数组中的版本也会更改。

如果你想制作一个单独的副本,你需要做这样的事情。

$rtabs[$season] = clone $itm;