这是我一段时间以来一直在考虑的事情。我想将一组方法链接在一起,如下面所示的例子
方法链的概念并不简单,但我想要的是通过相同的add
方法来添加所有动物,那么我应该如何确定我们在add
内添加的动物类型{1}}方法?
$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?
}
}
答案 0 :(得分: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'));
答案 1 :(得分:0)
该问题的一个解决方案是覆盖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') )
可能是一个更好的解决方案,在我看来,其他开发人员已经清楚地知道发生了什么。 (这可能不是你的情况,因为我不知道你究竟在做什么的细节。)