2012-09-18 59 views
-1

我真的坚持在PHP引用。在我PROGRAMM我有类似的东西,以这样的:如何复制对象?

  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. 问题

我应该做些什么$newVar变量的所有内容复制到我的$var变量,以便在使用var_dump()功能之后,我将能够看到它,该功能在功能doSmth()之外。而且我不能在我的程序中使用getter和setter,因为我有很多这样的代码,并且会有很多代码。有没有可能用我的限制来解决这个问题?

UPDATE:我不能在我的功能doSmth()返回值,我也试过__clone,但没有任何效果。有人可以告诉我,我怎样才能做到这一点__clone()

+7

尝试寻找[__clone()](http://php.net/manual/en/language.oop5.cloning.php) –

回答

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); 
+0

是的,这有效,但他想改变'$ var' –

+0

是的,我无法返回任何价值。 – warmspringwinds

+0

为什么你不能?这是不是在问题中说。 – artragis

4

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

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

只是注意到我重复了我的答案...... – besworland

+0

男人,告诉我我该怎么做?我已经试过了。 – warmspringwinds

+0

我已经更新了我的答案。告诉我你是否还有问题。 – besworland

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);