CakePHP AppError扩展函数

CakePHP AppError扩展函数,php,cakephp,Php,Cakephp,我的CakePHP站点上有以下代码作为AppError文件: <?php class AppError extends ErrorHandler { function _outputMessage($template) { $this->controller->render($template, 'error'); $this->controller->afterFilter(); echo $thi

我的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函数吗


感谢

它扩展了类,并且AppError继承了ErrorHandler的所有方法。因此,如果没有方法error404(),AppErrorr对象将调用其父方法,在本例中,ErrorHandler中的error404

但是,如果定义ErrorHandler中已经存在的方法,它将不会“扩展它”,而是“重写它” 换句话说:如果您创建方法error404,并且AppError对象调用此方法,它将调用其版本的error404()

现在,如果您查看ErrorHandler中的error404函数

 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)类的行为。尝试模拟该方法(包括参数并在末尾退出)

另外
$this->set('title_for_layout','Not Found(404))我想应该是

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

奇怪的是,您需要传递任何东西,因为我只是扩展函数,而不是调用它。当您使用其他具有参数和逻辑的方法,但在重写中不包含它们时,它工作正常?@Cameron您没有扩展函数。您正在扩展该类。您不能扩展函数,只能重写它。当您扩展一个类并继承它的所有函数时,如果您在扩展类(存在于父类中)中定义了一个函数,您将重写它的父类中的函数。因此,如果AppError对象正在调用
$AppError->erro404()
,那么它期望父类的行为。但是,如果您在一个错误中重写此函数,它将调用该函数,如果此函数不同,那么您将得到一个错误