0

我正在尝试在 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 中完全相同的行为,在那里我可以动态地覆盖多个方法......仍然欢迎想法和/或见解。

4

1 回答 1

0
class ExtendedAction extends Action {

    public function doit() {
        return "Custom action";
    }

}

$ap->perform(new ExtendedAction);

您必须声明一个常规的新类,它可以是extend您的基类。你不能像你正在尝试的那样即时执行此操作。

我正在尝试做的是模仿 Java 中通常所做的事情,并使用被覆盖的方法发送原始类......

这在 PHP 中是不可能的。

于 2012-12-01T07:09:17.033 回答