繁体   English   中英

PHP:具有共享方法的方法链接

[英]PHP: Method chaining with shared methods

这是我一段时间以来一直在考虑的事情。 我想将一组方法链接在一起,如下面的示例所示。
方法链接的概念毫不费力,但是我想要的是通过相同的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?
    }

}

由于我们在谈论面向对象的设计,因此实现层次结构将更加“正确”和灵活,例如:

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

解决该问题的一种方法是重写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') )

可能是一个更好的解决方案,我认为其他开发人员很清楚正在发生什么。 (因为您不知道确切的操作细节,所以可能对您而言并非如此)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM