我想知道如何克隆包含对象的扩展类SplHeap。例如,如果FooHeap扩展了SplHeap,FooHeap是否可以使用__clone方法并克隆其对象元素?
class FooHeap extends SplHeap{
public function compare($value1, $value2){.... }
public function __clone(){
// how do I access its elements to clone?
}
}
或者,如果我必须创建一个新的FooHeap对象并重新插入对象元素的克隆,是否有一种方法(例如从上到下,或从下到上)我应该重新插入克隆元素以确保优化的性能?
答案 0 :(得分:2)
SplHeap的本质是它会自动排序所有插入的值(如对象),当迭代它时,每个值都会从堆中删除。
克隆堆时,也会复制插入的值,但不会克隆对象,而是按预期复制为参考。
通常的方法是迭代存储的数据并克隆找到的每个对象。但是因为迭代删除节点,你必须在某处收集它们并重新插入。
没有选择顺序,因为你所能做的只是"得到下一个"。
如果你担心表现,请测量!
我发现这段代码有效:
class MyHeap extends SplHeap
{
public function compare($a, $b)
{
return (strcmp(get_class($a), get_class($b)));
}
public function __clone()
{
echo "Im cloning in ";
foreach ($this as $obj) {
$clones[] = clone($obj);
}
foreach ($clones as $obj) {
$this->insert($obj);
}
var_dump($this);
}
}
$heap = new MyHeap();
$obj1 = new stdClass();
$heap->insert($obj1);
$obj2 = new stdClass();
$heap->insert($obj2);
var_dump($heap);
$clone = clone($heap);
var_dump($clone);
foreach ($clone as $insert) {
var_dump($insert);
}
foreach ($heap as $insert) {
var_dump($insert);
}
输出:
class MyHeap#1 (0) {
}
Im cloning in class MyHeap#4 (0) {
}
class MyHeap#4 (0) {
}
class stdClass#6 (0) {
}
class stdClass#7 (0) {
}
class stdClass#2 (0) {
}
class stdClass#3 (0) {
}
答案 1 :(得分:0)
通过定义函数__clone,您可以指定要为克隆对象更改的变量。在下一个例子中,我将$ cloned设置为true。原始对象具有$clone = false
,但克隆的对象具有$cloned = true
。因此$ data保持不变。
<?php
class FooHeap extends SplHeap {
public $data = "asd" ;
private $cloned = false ;
public function __clone(){
$this->cloned = true ;
$this->rewind() ; //Just rewind iterator back to start, if you need
}
public function compare(){
}
}
$original = new FooHeap() ;
$original->insert("some stuff") ;
$original->insert(100) ;
$clone = clone $original ; //Data nodes are cloned from original object
$data = array() ;
$length = $clone->count() ;
for ($i = 0 ; $i < $length ; $i++){
$data[] = $clone->current() ; //Access current data node and store it in data
$clone->next() ; // Move to the next data node
}
var_dump($data) ; //Check your data array
?>