克隆在simple_html_dom库中

时间:2013-11-12 19:22:29

标签: php clone simple-html-dom

我正在使用simple_dom_html库。我有节点克隆的问题。 我需要为某些表克隆tr,但clone只需复制它。我试图覆盖clone中的simple_html_dom_node方法 - 无法正常工作。 这是我的代码片段:

$trNode = $this->_getClosestTrNode($node->parent()); //get closest table tr node
$tableBodyNode = $trNode->parent();
//clone tr nodes
for($j = 0; $j < $cloneCount; $j ++){
    $tr = clone $trNode;
    $tableBodyNode->appendChild($tr);
}

UPD:

$tr = unserialize(serialize($trNode));

不是很好的解决方案,因为需要大量的内存。

1 个答案:

答案 0 :(得分:0)

编辑:

啊,你正在使用 simple_html_dom 。我浏览了源代码,问题在于节点(对象)关系(以及所有循环的父子引用)

在PHP中克隆对象时,克隆过程是肤浅的。这意味着只复制最外面的对象。这是因为,默认情况下,在PHP中,对象作为Reference传递,而不是按值传递。

示例代码:

class A {}
class B {
    public $a;
    public function __construct(A $a) { $this->a = $a; }
}

$a = new A();
$b = new B($a);
$c = clone $b;

print spl_object_hash($a) .'<br>';
print spl_object_hash($c->a).'<br>';

输出:

00000000449326660000000062d82106
00000000449326660000000062d82106

如您所见哈希是一样的。

更改此行为的唯一方法是覆盖__clone()方法,希望更改 simple_html_dom 的源代码或扩展库定义的每个对象。

序列化和反序列化的工作原理是因为PHP创建了对象及其属性(包括子对象)的字符串表示形式。由于所有的循环引用,它需要很长时间。

我建议换到另一个使用libxml作为后端的库。