-1

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

  1. 程序

    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后能够看到它。而且我不能在我的程序中使用 getter 和 setter,因为我有很多它们,而且会有很多代码。是否有可能在我的限制下解决这个问题?var_dump()doSmth()

更新:我无法在我的函数中返回值,我doSmth()也尝试过__clone但没有任何效果。有人可以告诉我我该怎么做__clone()吗?

4

3 回答 3

4

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

function doSmth(Test &$var)
{
    // Here you can do something with your var
}
于 2012-09-18T15:08:23.417 回答
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);
于 2012-09-18T15:07:16.807 回答
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);
于 2012-09-18T15:13:01.070 回答