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

该问题的一种解决方案是覆盖 Zoo 类中的 __get 以返回“创建者”类。

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 回答