2011-04-22 84 views
0

我有下面的代碼在我的CakePHP網站我AppError文件:CakePHP的AppError擴展功能

<?php 

class AppError extends ErrorHandler 
{ 
    function _outputMessage($template) 
    { 
     $this->controller->render($template, 'error'); 
     $this->controller->afterFilter(); 
     echo $this->controller->output; 
    } 

    function error404() 
    { 
     $this->set('title_for_layout', 'Not Found (404)'); 
    } 
} 

?> 

第一功能的工作原理是使所有錯誤使用錯誤的佈局而不是默認的罰款。但第二個功能導致應用程序炸燬...爲什麼?它不應該只是擴展錯誤處理程序中的error404函數嗎?

感謝

回答

2

它擴展了類,並通過AppError繼承所有來自ErrorHandler.So的方法,如果你沒有一個方法error404()時,AppError對象將調用其父方法,在這種情況下error404在ErrorHandler中;

但是,如果您定義了已在ErrorHandler中退出的方法,它將不會「擴展它」而是「覆蓋它」。 換句話說:如果您創建方法error404這種方法是通過AppError稱爲對象,它會調用其error404()版本

現在,如果你看一下error404函數內的ErrorHandler

function error404($params) { 
    extract($params); 

    if (!isset($url)) { 
     $url = $action; 
    } 
    if (!isset($message)) { 
     $message = ''; 
    } 
    if (!isset($base)) { 
     $base = ''; 
    } 

    header("HTTP/1.0 404 Not Found"); 
    $this->error(array('code' => '404', 
         'name' => 'Not found', 
         'message' => sprintf("The requested address %s was not found on this server.", $url, $message), 
         'base' => $base)); 
    exit(); 
} 

可以看到在這個函數中有一定的行爲和參數。所以這就是爲什麼你的應用程序崩潰的原因,AppError調用error404期望父類(ErrorHandler)類的行爲。嘗試模仿方法(通過包含params並退出)。

而且$this->set('title_for_layout', 'Not Found (404)');我覺得應該是

$this->controller->set('title_for_layout', 'Not Found (404)');` 
+0

似乎很奇怪,你需要通過任何東西,因爲我只是擴展功能不調用它。當你做其他方法有參數和邏輯,並不包括他們在你的覆蓋它工作正常嗎? – Cameron 2011-04-23 12:02:55

+0

@Cameron你沒有擴展這個功能。你正在擴展這個類。你不能擴展一個函數,你只能覆蓋它。當你擴展一個類並繼承它的所有函數,並且如果你在擴展類中定義了一個函數(它在父類中出現),你可以從它的父類中覆蓋函數。因此,如果AppError對象正在調用'$ apperror-> erro404()'的某個地方,它預期父類的行爲。但是,如果在ApError中重寫此函數,它將調用該函數,並且如果此函數與父項不同,則會發生錯誤 – 2011-04-23 17:44:02