首页 > 解决方案 > 如何正确地将派生类的方法设置为父类的可调用方法?

问题描述

我正在编写一个带有一些 call_user_func() 的基本类,然后使用我想从所述 call_user_func() 调用的方法编写派生类。它看起来如下:

class Basic
{
    private $InputHandler = null;

    public function SetNewHandler(callable $NewHandler)
    {
        $this->InputHandler = $NewHandler;
    }

    public function ProcessInput()
    {
        call_user_func(array($this,$this->InputHandler));
    }
}

class Specific extends Basic
{
    public function Handler()
    {
        echo "Handler() is called\n";
    }
}

$spec = new Specific();
$spec->SetNewHandler('Specific\Handler');
$spec->ProcessInput();
unset($spec);

显然它不起作用,因为它不Specific\Handler被识别为有效的可调用对象。但是实现这一结果的正确方法是什么?父类应该忽略派生类和/或处理程序方法的实现细节。

我使用 php 7.4

标签: phpcallback

解决方案


我只想在基类中创建一个默认处理程序方法:

class Base
{
    public function ProcessInput()
    {
        $this->Handler();
    }

    public function Handler() 
    {
        // Some default code or just leave empty
        echo "Base Handler() is called\n";
    }
}

class Specific extends Base 
{
    public function Handler()
    {
        echo "Specific Handler() is called\n";
    }
}

$spec = new Specific;
$spec->ProcessInput();

这样您就不需要手动绑定要用于每个实例的处理程序(这可能很麻烦)。如果您想要一个新的处理程序,请使用该处理程序创建一个新类。

这是一个演示


推荐阅读