我怎样才能复制一个物体?

时间:2012-09-18 15:04:03

标签: php

我真的被php中的引用困住了。在我的程序中,我有类似的东西:

  1. PROGRAMM

    class Test
    {
        private $_property;
    
        function __construct($property)
        {
            $this->_property = $property;
        }
    
        public function setProperty($property)
        {
            $this->_property = $property;
        }
    
        public function getProperty()
        {
            return $this->_property;
        }
    }
    
    function doSmth(Test $var)
    {
        $newVar = new Test('test');
    
        //I need to do something here...
    }
    
    $var = new Test('original');
    
    doSmth($var);
    
    var_dump($var);
    
  2. 问题

  3. 如何将$newVar变量的所有内容复制到我的$var变量,以便在使用函数{{1}之外的var_dump()函数后能够看到它1}}。而且我不能在我的程序中使用getter和setter因为我有很多它们而且会有很多代码。有可能用我的限制来解决这个问题吗?

    更新:我无法在我的函数doSmth()中返回值,我也尝试了doSmth()但没有任何效果。有人可以告诉我如何使用__clone进行操作?

3 个答案:

答案 0 :(得分:4)

可以使用 clone 关键字创建对象副本。它将帮助您创建源对象的完整副本。或者,我认为也可能对您有用,您可以尝试通过引用传递Test对象:

function doSmth(Test &$var)
{
    // Here you can do something with your var
}

答案 1 :(得分:2)

$newVar仅存在于函数的上下文中。

您要做的是创建一个这样的返回值:

function doSmth(Test $var)
{
    $newVar = new Test('test');

    //I need to do something here...

    return $newVar;
}

并改为调用这个函数:

$myNewShinyVar=doSmth($var);

这样,您的函数返回类Test的对象作为返回值。

var_dump($myNewShinyVar);

编辑:如果您无法返回值,则可以通过引用传递:

function doSmth(&$var)
{
    $var = new Test('test');
}

这将修改作为参数传递给它的变量本身(而不是传递它的副本)

doSmth($var);
var_dump($var);

答案 2 :(得分:0)

如果我多次阅读你的问题,我认为这就是你所追求的:

function doSmth(Test $var)
{
  $newvar = clone $var;
  // do some stuff on a copy of $var, leaving $var intact
}

$var = new Test('original');

doSmth($var);

var_dump($var);