将类定义发送到PHP中的函数

时间:2012-12-01 07:06:48

标签: php oop function arguments override

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

1 个答案:

答案 0 :(得分:0)

class ExtendedAction extends Action {

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

}

$ap->perform(new ExtendedAction);

您必须声明一个常规的新类,它可以extend您的基类。你不能像在尝试那样动态地做到这一点。

  

我正在尝试做的是模仿Java中常用的内容,只使用重写的方法发送原始类...

这在PHP中是不可能的。