具有父函数的PHP链

时间:2016-10-21 16:10:34

标签: php parent-child php-7 chaining

我想用自己的父函数链接一个方法。

示例:

class Query
{
    protected $limit;

    /**
     * Returns some third object that isn't in this family.
     * This object represents the results, and also has
     * a first function that gets called in a chain.
     */
    public function get()
    {
        // Do Stuff

        return new /* ... */;
    }

    public function take($amount)
    {
        $this->limit = $amount;

        return $this;
    }
}

class ChildQuery extends Query
{
    protected $singular = false;

    public function get()
    {
        if($this->singular)
            return $this->take(1)->parent::get()->first();

        return parent::get()
    }

    public function singular()
    {
        $this->singular = true;

        return $this;
    }
}

这显然不是完整的功能集,也不起作用,但你明白了。我希望ChildQuery::get能够在链中调用Query::get

现在,我必须这样做:

public function get()
{
    $this->take(1);

    parent::get()->first();
}

这对我没有吸引力。有什么想法吗?

我正在运行PHP 7,如果重要的话。

我的最终结果看起来像这样:

$query->singular()->get(); // ($query is a ChildQuery)

1 个答案:

答案 0 :(得分:1)

不可能通过对象的公共接口调用父方法(即使它与当前上下文是同一个类/对象)。请查看https://stackoverflow.com/a/11828729/2833639

在我看来,你的解决方案是正确的方法。

关闭主题:我建议您阅读https://ocramius.github.io/blog/fluent-interfaces-are-evil/以评估流畅的界面是否适合您的使用案例。