获取\ Closure,表示对方法的调用,该方法被该特征内的特征覆盖

时间:2019-12-02 06:04:34

标签: php php-closures php-traits

编写特征时,如何获得\Closure来调用被我所写的特征覆盖(包装)的基本方法?

这假设该特征将在扩展定义该方法的类的类中使用。这是一项合同协议,因此通过假设消除了首先确定是否存在覆盖方法的问题。

简单parent::method()不能正常工作并获得闭包的原因是必要的:使用trait的类本身可以被扩展,并且在进一步的子类parent::中将引用其立即数。超类,当特征的替代尝试调用parent::method()时将导致无限递归,但实际上将递归调用自身。

当然可以使用反射并在继承链上进行线性搜索,但是也许有更简单的方法吗?

场景:

trait Who
{
    public function greeting()
    {
        $parentGreetingClosure =
            $this->obtain_the_invocation_of_parent_greeting_with_this_object();
        $parentGreetingClosure();
        echo " from ".get_class($this)."\n";
    }

    public function obtain_the_invocation_of_parent_greeting_with_this_object() : \Closure
    {
        //THIS IS THE QUESTION. How do I implement this?
    }
}

class InformalBase
{
    public function greeting()
    {
        echo "Hi dood";
    }
}

class PoliteBase
{
    public function greeting()
    {
        echo "Good afternoon";
    }
}

class Informal extends InformalBase
{
    use Who;
}

class Polite extends PoliteBase
{
    use Who;
}

(new Informal())->greeting();
(new Polite())->greeting();

预期输出:

Hi dood from Informal
Good afternoon from Polite

0 个答案:

没有答案