php - 如何正确地将派生类的方法设置为父类的可调用方法?
问题描述
我正在编写一个带有一些 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
解决方案
我只想在基类中创建一个默认处理程序方法:
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();
这样您就不需要手动绑定要用于每个实例的处理程序(这可能很麻烦)。如果您想要一个新的处理程序,请使用该处理程序创建一个新类。
这是一个演示
推荐阅读
- ajax - 如何将字典项从客户端(Ajax)传递到服务器端(MVC API)
- r - sparkR的read.df中是否有“报价”参数?
- django - 如何使用原始 SQL 而不是 django ORM 从数据库中检索数据
- rust - 正确解析 Clap ArgMatches 的惯用 rust 方法
- java - 编辑不同类中的位置值
- ios - 更新到 Xcode 11 后,Xamarin iOS 应用程序在 iPad 上显示白色空白屏幕
- html - 如何更改 html/css 中的选项卡窗格颜色?
- android - 无法创建新的颤振项目
- r - 如何以 R“data.table”的方式记录不重叠的范围(或时间间隔)?
- flutter - 在小部件之间传递数据