2012-12-20 43 views
2

我有以下PHP代碼作爲resposibility鏈,我使用PHP5.4.9。鏈的resposibility代碼錯誤爲PHP

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語言,一個抽象類和三個或實施責任心設計鏈模式更多的課程可以做一些鏈接。但只有前兩個對象有效。

任何遺漏?或者PHP不能在PHP5.4.9下使用這種編碼風格?

謝謝。

回答

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()

+0

是的,這就是問題所在,謝謝! –

+0

對不起,我的英語非常糟糕 – roben