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 语言实现责任链设计模式,一个抽象类和三个或更多类作为一个链来做某事。但只有前两个对象有效。

有什么遗漏吗?还是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 回答