1

これは私がしばらく考えていたものです。以下に示す例のように、一連のメソッドをチェーン化します。
メソッドチェーンの概念は簡単ですが、私が望むのは、すべての動物を同じaddメソッドで追加することです。では、メソッド内に追加する動物の種類をどのように把握する必要がありますaddか?

$zoo = new Zoo;
$lion = $zoo->lion->add('Lucas the lion');
$cockatoo = $zoo->cockatoo->add('Chris the cockatoo');

class Zoo {

    function add($name) {
        //How to figure out if the animal is a Lion or an Cockatoo?
    }

}
4

2 に答える 2

1

オブジェクト指向設計について話しているので、次のような階層を実装する方がはるかに「正確」で柔軟です。

interface IAnimal {}
class Lion implements IAnimal {}

class Zoo
{
    private $animals = array();

    public function add(IAnimal $animal)
    {
        $this->animals[] = $animal;
        return $animal;
    }
 }

 $zoo = new Zoo();
 $lion = $zoo->add(new Lion('Lucas'));
于 2011-02-22T14:21:33.550 に答える
0

この問題の解決策の1つは、Zooクラスの__getをオーバーライドして、「creator」クラスを返すことです。

function __get($animal){
    return new Creator($this, $animal);
}

次に、作成者クラスにzooクラスのadd関数を呼び出させます。

class Creator{
    public function __construct($zoo, $animal){
    ....
    }
    public function add($details){
        $zoo->add($this->_animal, $details);
    }
}

このソリューションはかなり醜く、将来の開発者の観点からはそれほど明確ではありません。コメントで指摘されているように、これを行うにはもっと良い方法があります。次のようなことをします:

$zoo->add('lion', 'whatever')

また

$zoo->add( new Lion('Whatever') )

より良い解決策かもしれませんし、私の意見では、何が起こっているのかは他の開発者にははるかに明らかです。(私はあなたがしていることの詳細を正確に知らないので、これはあなたには当てはまらないかもしれません)。

于 2011-02-22T14:19:06.170 に答える