为什么我的__clone()没有按预期工作?

时间:2014-08-03 20:32:36

标签: php oop magic-methods

所以我在我的一个PHP类中使用下面的代码(在一个更大的库中):

public function __clone() {
    // recreate this class in its' current state
    $new = new \uri(\uri\generate::string($this->object));
    // give it the same origin
    $new->input = $this->input;
    // now send the new instance back
    return $new;
}

简而言之,我需要重新创建类而不是传统的克隆。但是,每当我使用clone时,它仍然会返回常规克隆而不是新实例。

我需要创建一个新实例,因为在类中使用了引用变量。

-

我的测试脚本:

$uri1 = new uri('example.com');
$uri2 = clone $uri1;

$uri2->host = 'google.com';

// __toString() returns the URI in its' current state
echo $uri1.PHP_EOL.$uri2;

测试的预期输出:

example.com
google.com

测试的实际输出:

google.com
google.com

我的问题:我做错了什么?

我使用的是PHP 5.5.6


对于需要完整上下文的人,请参阅以下链接( 145 152 行)。请注意,有很多。

The library in question

1 个答案:

答案 0 :(得分:4)

来自文档

  

当克隆一个对象时,PHP 5将执行所有的浅层副本   对象的属性。任何引用其他的属性   变量,仍然是参考。

     

void __clone(void)克隆完成后,如果__clone()   定义方法,然后定义新创建的对象的__clone()方法   将被调用,以允许任何必要的属性   改变。

所以你需要做的是

public function __clone() {
    // clone properties that needs cloning (no referancing)
}