编写特征时,如何获得\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