На 404 страницу не хорошо. Потом может появиться много мыслей о битых ссылках и этому подобных.
Если уже и хочется "завернуть" ошибку интерпритатора в собственное представление тогда может быть стоит подумать про страницу 500...
По существу: для пользовательской обработки ошибок существуют функции обработки ошибок:
http://www.php.net/manual/ru/ref.errorfunc.phpОднако стоит заметить что фатальные ошибки времени выполнения это неустранимые средствами самого скрипта ошибки, такие как ошибка распределения памяти и т.п. При появлении фатальной ошибки выполнение скрипта в таком случае прекращается. (
http://www.php.net/manual/ru/errorfunc.constants.php)
В случае попытки получить доступ к приватным методам интерпритатор генерирует фатальную ошибку: Fatal error: Call to private method A::foo() from context
<?php
class A
{
private function foo()
{
echo "Hello world";
}
}
$A = new A();
$A->foo();
?>
Fatal error: Call to private method A::foo() from context '' in D:\www\index.php on line 11
Варианты с try...catch также как и с is_callable не подходят для решения этой задачи.
Однако на просторах www есть предложение отлавливать Fatal error с помощью импровизированного блока try ... catch используя функции ob_start ob_clean_flush примерно так:
ini_set("display_errors", "on");
error_reporting(E_ALL);
function fatal_error_handler($buffer)
{
if (preg_match("|(Fatal error</b>:)(.+)(<br)|", $buffer, $regs) )
{
unset($A);
return "Ошибка инкапсуляции";
}
return $buffer;
}
class A
{
private function foo()
{
echo "Hello world";
}
}
ob_start("fatal_error_handler");
$A = new A();
$A->foo();
echo "Program still executing....";
ob_end_flush();
хотя думаю что это не совсем корректно, но для крайних случаев пойдет.