所以我在我的一个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 行)。请注意,有很多。
答案 0 :(得分:4)
来自文档
当克隆一个对象时,PHP 5将执行所有的浅层副本 对象的属性。任何引用其他的属性 变量,仍然是参考。
void __clone(void)克隆完成后,如果__clone() 定义方法,然后定义新创建的对象的__clone()方法 将被调用,以允许任何必要的属性 改变。
所以你需要做的是
public function __clone() {
// clone properties that needs cloning (no referancing)
}