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

发布于 2024-10-18 11:44:26 字数 420 浏览 4 评论 0原文

这是我一段时间以来一直在思考的事情。我想将一组方法链接在一起,如下所示的示例。
方法链接的概念很简单,但我想要的是让我们所有的动物都通过相同的 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?
    }

}

Here's something that I've been thinking about for some time. I want to chain together a set of methods like in the below shown example.
The concept of method chaining is no brainer, but what I want is to make all of our animals be added through the same add method, so how should I figure out what type of animal that we're adding inside the add method?

$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?
    }

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

谎言 2024-10-25 11:44:26

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

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

Since we're talking about Object Oriented Design it would be much more "correct" and flexible to implement hierarchy like:

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'));
夏末的微笑 2024-10-25 11:44:26

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

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

然后让creator类调用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') )

可能是一个更好的解决方案,在我看来,其他开发人员很清楚发生了什么。 (这对你来说可能不是这样,因为我不知道你到底在做什么的细节)。

One solution to the problem would be to override __get in the Zoo class to return a 'creator' class.

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

Then let the creator class call the add function in the zoo class.

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

This solution is fairly ugly, and from a future developers perspective, not that clear. As pointed out in the comments, there are better ways about going this. Doing something like:

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

or

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

May be a better solution and in my opinion it is far clear to other developers what is happening. (This may not be the case for you, as I don't know the details of exactly what you are doing).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文