2009-05-22 11 views
0

私の仕事では、オブジェクトのシリアル化(XML出力用)の一種を書くのは非常にいいですね。私はすでにそれをやったことがありますが、再帰的なリンクを避ける方法はありません。PHPハンドメイドのシリアル化の問題

問題は、一部のオブジェクトでは、その親へのリンクを持つパブリック(!)プロパティが必要であるということです(本当にnessecaryです)。そして、私はいくつかの子供を束縛する親オブジェクトを直列化しようとすると、親へのリンクを持つ子供は永遠に再帰を行います。

print_r()がハックすることなく再帰を処理するソリューションはありますか? 「if($ prop === 'parent')」のようなものは使用できません。異なるコンテキストの親に複数のリンクがあることがあります。

答えて

1

独自のシリアライズ機能を記述し、常に処理済みアイテムのリストを渡します。

public function __sleep() { 
    return $this->serialize(); 
} 
protected function serialize($processed = array()) { 
    if (($position = array_search($this, $processed, true)) !== false) { 
     # This object has already been processed, you can use the 
     # $position of this object in the $processed array to reference it. 
     return; 
    } 
    $processed[] = $this; 
    # do your actual serialization here 
    # ... 
} 
+0

はnitpickerしてはならないが、それは当然のようになります: 戻ります$ this->シリアル化PHP5(私はあなたがPHP5を使用している、と仮定)オブジェクトに常にコピー参照するので、次の操作を行うことができます(); – n3rd

+0

私には恥...すでに使用されているインスタンスのリストはかなり良い解決策です!私は外部からでもそれを行うことができ、すべてのクラスに直列化メソッドを提供する必要はありません。 すてきな答えをありがとうございました。 PS:もちろん、btw、はいphp5。 OOPについてのphp4の質問では、一段階もっと汚いIMHOです。 – Jet

+0

@ n3rd:thx、fixed – soulmerge