我正在尝试在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中常用的东西,只使用重写的方法发送原始类,所以我不必创建一个全新的类只是将它传递给一个函数。 / p>
修改
我已经想到了一种有点笨重的方式,但是我只需要使用闭包来实现:
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完全相同的行为,我可以动态地覆盖多个方法......仍然欢迎提供想法和/或见解。
答案 0 :(得分:0)
class ExtendedAction extends Action {
public function doit() {
return "Custom action";
}
}
$ap->perform(new ExtendedAction);
您必须声明一个常规的新类,它可以extend
您的基类。你不能像在尝试那样动态地做到这一点。
我正在尝试做的是模仿Java中常用的内容,只使用重写的方法发送原始类...
这在PHP中是不可能的。