2011-01-07 9 views
6

私は親子OOの関係を持っています。親obejctsには多くの子オブジェクトがあり、すべての子オブジェクトはその親を参照で知っています。PHPオブジェクトの親子再帰

親は子供でもあります(基本的にはツリー)。私はルートオブジェクトにのvar_dump()を行うと、それは[「親」] =言う

>再帰何度と生成された記述は、本当に長いでしょう。

私は何か間違っていると思います。はいの場合、私は "ベストプラクティス"に興味があります。

ありがとうございました!

+0

いくつかのコードはいいと思います! –

+1

あなたのグラフ(その親のうちの1つの子孫でもある親)にサイクルがあるように聞こえますが、コードやサンプルデータを見ることなく、確かに言うのは難しいです。 – FrustratedWithFormsDesigner

+0

あなたが再帰が深すぎないと確信している限り、それは問題ありません。それ以外の場合、問題が発生する可能性があります。 jsonでオブジェクトをエンコードします。 – usoban

答えて

12

あなたは何か間違っているわけではありません。あなたはその子への参照を持つ親を持ち、各子はその親への参照を持ちます。 var_dump()ルートオブジェクトの場合は、子オブジェクトを反復処理して出力し、各子は親オブジェクトへの参照を持つため、バックアップを行います。これは通常、無限ループ(parent - > child - > parent - > child - > ...)を引き起こすので、PHPはすでに訪れたオブジェクトのリストを保持し、見つかったときにはダンプを試みませんもう一度 "RECURSION"を表示します。

これは、PHPがガベージコレクションに参照カウントを使用し、これらのような循環構造が単独では解決しないということだけです。その結果、スクリプトがメモリをリークして問題になる場合もあります。これを解決するには、手動でクリーンアップする必要があります。親オブジェクトがスコープから外れる直前に、すべての親ポインタをnullに設定する必要があります。

も参照してください:http://bugs.php.net/bug.php?id=33595

+0

メモリリークはPHP 5.3以降で修正されているようです:(最後の2コメント:https://bugs.php.net/bug.php?id=33595を参照してください) –

6

var_dump関数は再帰的にあなたのオブジェクトグラフの上に歩くと、あなたのオブジェクトのすべてのアクセス可能なデータを印刷します。今すぐプレーン・イングリッシュに下の図を入れてみてください。

 has    var_dump: 
Parent ----> Child   "The Parent object has a child object" 
^    |    "That Child object has a Parent Object" 
|______________| has    "That Parent object …" 

PHPがこの再帰を検出するほどスマートでない場合、無限に実行されます。代わりに、そのオブジェクトをダンプしてからダンプすることを認識します。RECURSION。あなたは間違って何もしていません。

Click here for another explanation

0

のみ有用である「逆ツリー」を、作成時に再帰的な言及を避けることができる唯一の方法ですあなたは兄弟を知らなくても、子から親に検索したいされています。同様:だから

class Foo { 
    protected $parent; 

    public function __construct(Foo $parent = null) { 
     $this->parent = $parent; 
    } 

    public function getParent() { 
     return $this->parent; 
    } 
} 

$a = new Foo; 
$b = new Foo($a); 
$c = new Foo($b); 

$cからあなたは、再帰的な言及せずに、$aである、ルートノードまで追跡することができます。

ルートノードから子ノードに移動する必要がある場合は、既に行ったこと以外の解決策はありませんが正しいです。

関連する問題