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

ご覧のとおり、ハッシュは同じです。

この動作を変更する唯一の方法は、メソッドをオーバーライドすることです。希望とは、 simple_html_dom__clone()のソース コードを変更するか、ライブラリによって定義された各オブジェクトを拡張することを意味します。

PHP がオブジェクトとそのプロパティ (子オブジェクトを含む) の文字列表現を作成するため、シリアライズとアンシリアライズが機能します。すべての循環参照のため、非常に時間がかかります。

libxml をバックエンドとして使用する別のライブラリに変更することをお勧めします。

于 2013-11-12T19:43:06.830 に答える