Он расширяет класс и тем самым AppError наследует все методы из ErrorHandler. Поэтому, если у вас нет метода 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)');
Iдумаю, что это должно быть
$this->controller->set('title_for_layout', 'Not Found (404)');`