Эта тема на forum.dklab.ru


artemiusgreat: error handler как метод класса
Здравствуйте, уважаемые веб-девелоперы.
Хотел спросить может быть кто знает, возможно ли использовать в качестве своего перехватчика ошибок метод какого-либо класса...в стандартной документации по ПХП наешл пример использования только с отдельной функцией, т.е.

set_error_handler ('xError'); // set new handle
function xError () { // new handle implementation
print 'My error!';
return;
}
print no_value; // error

Я проверил, действительно работает, при генерации ошибки выдается мое собщение - "My error"

НО мне надо чтобы все это было оформлено по стандартам ООП, я попробовал следующее:

class test {
function test () {
set_error_handler (array (&$this, 'xError'));
}
function xError ($no, $str, $file, $line, $ctx) {
print 'My error!';
return;
}
}
$err = new test;
print no_value;


На что ПХП грязно выругался стандартной фразой - "Notice: Use of undefined constant no_value"
Т.е. обработчик остался старый!!! Я не понимаю что не так...подскажите, пожалуйста, ибо я в растерянности :(

Спасибо.
Валенок:
разве не надо возвращать true?
artemiusgreat:
Ксожалению возврат true или false совсем мне не помог... В документации тоже вроде ничего не сказано о том, что должен возвращать обработчик ошибок - т.е. вроде бы ничего...НО
Я только что проверил и оказалось, что при определенных условиях и это работает...только вот при каких пока точно определить не могу :)
Я данный скрипт пробовал на Апаче, установленном вручную, и ПХП там подключался как CGI модуль...возможно поэтому set_error_handler отказался принимать метод класса в качестве нового обработчика ошибок...других причин я не вижу.
И ТУТ ВДРУГ я решил попробовать сие творение на Денвере (там ПХП вроде бы не является CGI модулем)...И О ЧУДО все работает!
Вобщем либо меня глючит, либо ПХП (кстати. и там и там установлена версия 4.3.1).

Пройдя весь этот тернистый путь выяснилось, что даже в ПХП, установленным в ручном режиме можно обойти этот глюк - сгенерировать ошибку до описания класса :) Бред конечно, но работает

Чтобы заработало надо писать так:

set_error_handler (array(&$test, 'xError')); // bez etogo ne rabotaet !!!!! a eshe mojno pisat
// trigger_error ('') ili phpinfo ();
class test {
function test () {
set_error_handler (array (&$this, 'xError'));
return true;
}
function xError ($no, $str, $file, $line, $ctx) {
print 'My error!';
return true;
}
}
$err = new test;

Пробовал даже такой вариант:

class ErrorHandler {
static function MyHandler($no, $msg) {
echo "Error! " . $no;
}
}
set_error_handler("ErrorHandler::MyHandler");

Без толку (этот код тестил мой знаеомый программист на ПХП 5.х), тоже облом!
Как по мне все дело в методе установки ПХП, потому что в Денвере все работает, но к сожалению точнее обьяснить причины этого я не могу.

Вобщем, буду очень благодарен если кто-то сможет мне обьяснить что все это значит и почему без верхней строчки ничего не работает при ручной установке ПХП.
А в Денвере все нормально.

Благодарю за любые комментарии.
Anonymous:
а зачем обработчик ошибок делать ввиде класса?
neovav:
Все оказалось просто :
// Файл class.php :
class evnt
{
// Конструктор
function evnt()
{
return true;
}

// Функция для ловли сообщений
function handl($errno, $errstr, $errfile, $errline)
{
echo '$errno='.$errno.' , $errstr='.$errstr.', $errfile='.$errfile.', $errline='.$errline;
return true;
}
}

// Основной файл main.php
<?
include_once 'class.php';
$evnt=new evnt();
set_error_handler(array('evnt','handl'));
?>

// Т.е. если мы set_error_handler передаем массив, то первый элемент название класса, а второй название метода

Эта тема на forum.dklab.ru