2016-04-17 11 views
2

私はの流暢なインターフェイスを作成しようとしています。私はツリーを作成部分を削減したいPHP OOP:流暢なインターフェイスとツリーグラフ

<?php 
class node { 
    private $childs = array(); 
    private $parent; 

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

    public function addChild($child) { 
     $this->childs[] = $child; 
     return $this; 
    } 

    public function createChild() { 
     return $this->addChild(new node($this)); 
    } 

    public function setFoo() { 
     /* do something */ 
     return $this; 
    } 
} 

$root = new node(); 

$root ->addChild((new node($root)) 
      ->setFoo() 
     )->addChild((new node($root)) 
      ->setFoo() 
     ); 
?> 

は、ここで私は現在、何をすべきかの簡単な例です。

$root->createChild()->setFoo(); 
$root->createChild()->setFoo(); 

の1行: 私は何をしたい、このようなものです。新しいノードインスタンスを明示的に作成することなく(new演算子を使用して最初のコードで行ったように)。

私の目標は、コードにセミコロンを付けることなく、任意の順序の任意のツリーとそのノードを任意の度合いで作成できるようにすることです。

答えて

1

はむしろcreateChild機能を追加することよりも、私はあなたが一貫してデータ内の親/子関係を確立するためにあなたのコンストラクタとはaddChild機能を変更すべきだと思います。これを行うと、addChild関数とコンストラクターを使用して、createChild関数を使用せずに記述した内容を実行できます。今あなたのコンストラクタは、異なるツリーとツリー内のブランチとの間のクロスリンクを許可します。したがって、おそらく変更する必要があるものです。ツリーにこのことができますチェーン新しいオブジェクトをして

class node { 
    private $childs = array(); 
    private $parent; 

    public function __construct(node $parent = null) { 
     if(!is_null($parent)) { 
      $parent->addChild($this); 
     } 
    } 

    public function addChild(node $child) { 
     $this->childs[] = $child; 
     $child->parent = $this; 
     return $this; 
    } 

    public function setFoo() { 
     /* do something */ 
     return $this; 
    } 
} 

$tree = (new node())->addChild(new node()) 
        ->addChild((new node())->setFoo()) 
        ->addChild((new node())->addChild(new node()) 
              ->addChild(new node()) 
              ->setFoo() 
        ); 

createChild機能を使用しようとすると、時にはあなたが親を必要とし、時にはあなたが子供を必要とするキャッチ22状況です。両方を含むリターンオブジェクトを使用して解決できますが、回避し易い状況だと思います。あなたは「(新ノード())」構文が気に入らない場合は、静的関数は、移動するための方法かもしれません:

あなたの好みに応じて、少しきれいかもしれません
public static function create(node $parent = null) { 
    return new node($parent); 
} 

$tree = node::create()->addChild(node::create()) 
         ->addChild(node::create()->setFoo()) 
         ->addChild(node::create()->addChild(new node()) 
               ->addChild(new node()) 
               ->setFoo() 
        ); 
0

このメソッドを追加して、できるだけ子を作成することができます。

public function createManyChild($nbrOfChild) { 
    for($i = 0; $i < $nbrOfChild; $i++){ 
     $this->addChild(new node($this)); 
    } 
    return $this; 
} 

このようなコードを使用してください。

$root = new node(); 
$root->createManyChild(3)->setFoo();