Чтобы быть уверенным, что сложный объект полностью скопирован по значению, и что содержащиеся в нем обекты не переданны по ссылке, можно использовать такую функцию.

 

function clone_arrray_obj ($obj)
{
    $result = $obj;
    if (is_object($obj) || is_array($obj))
    { 
        if (is_object($obj))
        {
            $result = clone $obj;
            if(count($result))
            {
                foreach ($result as $i => $value)
                {  
                    $result->$i = clone_arrray_obj($result->$i);
                }
            }
        }
        else
        {
            if(count($result))
            {
                foreach ($result as $i => $value)
                {  
                    $result[$i] = clone_arrray_obj($result[$i]);
                }
            }
        }
        
    } 
    return $result;
}