PHP: метод цепочки с общими методами - PullRequest
1 голос
/ 22 февраля 2011

Вот кое-что, о чем я думал некоторое время. Я хочу связать воедино набор методов, как в приведенном ниже примере.
Концепция цепочки методов не проста, но я хочу, чтобы все наши животные были добавлены с помощью одного и того же 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?
    }

}

Ответы [ 2 ]

1 голос
/ 22 февраля 2011

Поскольку мы говорим о объектно-ориентированном проектировании , было бы гораздо более "правильным" и гибким реализовать иерархию, например:

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'));
0 голосов
/ 22 февраля 2011

Одним из решений этой проблемы было бы переопределение __get в классе Zoo для возврата класса 'creator'.

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

Тогда пусть класс создателя вызовет функцию add в классе zoo.

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') )

Может быть, лучшее решение, и, по моему мнению, другим разработчикам уже ясно, что происходит. (Это может быть не так, потому что я не знаю деталей того, что именно вы делаете).

...