【发布时间】:2021-03-22 06:56:44
【问题描述】:
我正在编写一个带有一些 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
【问题讨论】:
-
添加回调时,将其作为带有真实实例的数组传递:
->setNewHandler([$spec, 'Handler']),然后使用:call_user_func($this->InputHandler)执行它,如果可行。 -
Specific总是一个类,Handler总是一个方法?字符串的格式是Class\Handler? -
@Raskul 是的。是的。不。字符串的格式可以是任意的,只要它按预期工作即可。
-
@MagnusEriksson 我稍后会看看它是否有效,但第一个想法是我非常喜欢(尽可能)
callable在SetNewHandler()中输入提示,因为它提供了某种程度的傻瓜- 证明编码。 -
"字符串的格式可以是任意的,只要它按预期工作即可" - 由于您将提示输入为callable,因此字符串必须遵循特定的预定义格式,这不是任意的。