0

我正在使用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);
}

升级版:

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

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

4

1 回答 1

0

编辑:

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

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

示例代码:

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()方法,wish 意味着改变simple_html_dom的源代码或扩展库定义的每个对象。

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

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

于 2013-11-12T19:43:06.830 回答