我正在尝试在 PHP 中完成以下操作:
// Some interface type thing
class Action {
// Meant to be overridden
public function doit(){ return null; }
}
class ActionPerformer {
public function perform(Action $action) {
$action->doit();
}
}
$ap = new ActionPerformer();
// *** What I'm trying to do/simulate *** //
//
// But returns: Parse error: syntax error, unexpected '{' in
// <file> on line 19
//
$ap->perform(new Action(){ // <-- This is line #19
@Override
public function doit() {
return "Custom action";
}
});
有什么想法或见解吗?
提前致谢
编辑
我知道我可以扩展 Action 并覆盖我想要的函数,然后将新类作为参数传递。我正在尝试做的是模仿 Java 中通常所做的事情,只需将原始类与重写的方法一起发送,因此我不必创建一个全新的类来将它传递给一个函数一次。
编辑
我想到了一种有点笨拙的方法,但是使用闭包可以满足我的需要:
class Action {
private $isOverridden;
private $func;
public function __construct($func = null) {
$this->isOverridden = false;
if (!is_null($func)) {
$this->isOverridden = true;
$this->func = $func;
}
}
// Meant to be overridden
public function doit(){
if ($this->isOverridden)
return $this->func->__invoke();
return "='(";
}
}
// class ActionPerformer remains the same
$ap = new ActionPerformer();
echo $ap->perform(new Action(function(){ return "=)";}));
echo $ap->perform(new Action(function(){ return "=|";}));
echo $ap->perform(new Action(function(){ return "=P";}));
echo $ap->perform(new Action(function(){ return "=O";}));
尽管如此,我的主要目标是模仿与 Java 中完全相同的行为,在那里我可以动态地覆盖多个方法......仍然欢迎想法和/或见解。