2

私は責任の連鎖として次のPHPコードを持っています。私はPHP5.4.9を使用しています。

abstract class Logger
{
  protected $next;

  public function next($next)
  {
    $this->next = $next;
    return $this->next;
  }

  public function run(){
    $this->invoke();
    if(null!=$this->next){
      $this->next->invoke();
    }
  }
  abstract public function invoke();
}

class EmailLogger extends Logger
{
  public function invoke()
  {
    print_r("email\n");
  }
}

class DatabaseLogger extends Logger
{
  public function invoke()
  {
    print_r("database\n");
  }
}

class FileLogger extends Logger
{
  public function invoke()
  {
    print_r("file \n");
  }
}

$logger = new EmailLogger();
$logger->next(new DatabaseLogger())->next(new FileLogger());
$logger->run();

期待される出力は次のとおりです。

email
database
file

しかし、実際の出力:

email
database

PHP言語による責任設計パターンのチェーン、1つの抽象クラス、および3つ以上のクラスを実装して、チェーンとして何かを実行したいと考えています。ただし、最初の2つのオブジェクトのみが機能します。

足りないものはありますか?または、PHPはPHP5.4.9ではこのコーディングスタイルを使用できませんか?

ありがとう。

4

1 に答える 1

4

交換

public function run() {
    $this->invoke ();
    if (null != $this->next) {
        $this->next->invoke();
    }
}  

  public function run() {
    $this->invoke ();
    if (null != $this->next) {
        $this->next->run ();
    }
}

$this->next->invoke() 変更 してみてください $this->next->run()

于 2012-12-20T07:53:05.713 に答える