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 で一般的に行われていることを模倣し、オーバーライドされたメソッドを使用して元のクラスを送信することです。そのため、1 つの関数に一度渡すためだけにまったく新しいクラスを作成する必要はありません。

編集

少しぎこちない方法を考えましたが、クロージャを使用して必要なことだけを行います。

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 に答える