我正在使用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));
不是很好的解决方案,因为需要大量的内存。
答案 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作为后端的库。