PHP OOP
3 отговора
170 прегледа
PHP OOP
Здравейте, от коментарите из документацията на php попаднах на следния проблем, но не успях да разбера точно същината, така че надявам се някой да ми разясни.
Резулатът от това е '!!?!!'. Доколкото аз виждам нещата - създава се обект error, който се присвоява на $eh. Изпълнява се конструктора, който указва функция handler() за обработка на грешките. След това се инициализира член-променливата $error. Когато възникне грешката се изпълнява указаната функция handler(), но $error съдържа NULL, което ме навежда на мисълта, че не се извиква handler() на инстанцията $eh. Ако извикаме повторно конструктора:
....
$eh = new error;
$eh->setText('Error!
');
$eh->setIni();
trigger_error('text', E_USER_ERROR);
тогава резултата вече е
Error!
!!?!!
Ако обаче поставим повторното извикване на конструкцията преди инициализацията на член-променливата:
....
$eh = new error;
$eh->setIni();
$eh->setText('Error!
');
trigger_error('text', E_USER_ERROR);
резултата отново си е само '!!?!!'
Въпреки извършените експерименти, все още не мога да си съставя механизма на действие на php като цяло, както и в конктретния случай. Какви инстанции на обекта се създават и как се обработват от php, и защо се получава гореописаното поведение ?.
Благодаря предварително.
class error {
var $error;
function error() {
$this->setIni();
}
function handler() {
echo $this->error.'!!?!!';
}
function setText($text) {
$this->error = $text;
}
function setIni() {
set_error_handler(array($this, 'handler'));
}
}
$eh = new error;
$eh->setText('Error!
');
trigger_error('text', E_USER_ERROR);
?>
Резулатът от това е '!!?!!'. Доколкото аз виждам нещата - създава се обект error, който се присвоява на $eh. Изпълнява се конструктора, който указва функция handler() за обработка на грешките. След това се инициализира член-променливата $error. Когато възникне грешката се изпълнява указаната функция handler(), но $error съдържа NULL, което ме навежда на мисълта, че не се извиква handler() на инстанцията $eh. Ако извикаме повторно конструктора:
....
$eh = new error;
$eh->setText('Error!
');
$eh->setIni();
trigger_error('text', E_USER_ERROR);
тогава резултата вече е
Error!
!!?!!
Ако обаче поставим повторното извикване на конструкцията преди инициализацията на член-променливата:
....
$eh = new error;
$eh->setIni();
$eh->setText('Error!
');
trigger_error('text', E_USER_ERROR);
резултата отново си е само '!!?!!'
Въпреки извършените експерименти, все още не мога да си съставя механизма на действие на php като цяло, както и в конктретния случай. Какви инстанции на обекта се създават и как се обработват от php, и защо се получава гореописаното поведение ?.
Благодаря предварително.
Re: PHP OOP
относно set_error_handler
Instead of a function name, an array containing an object reference and a method name can also be supplied as the error_handler. - това се използва при твоя пример, но в мануалa пише че работи при 4.3.0, така че проблема може да е във версията ти......защото и функцията трябва да връща нещо си, пък тя връща null.....
а ако добавиш това
echo '<pre>';
var_dump($eh);
преди trigger_error, ще видиш че променливата error си е сетната правилно
Instead of a function name, an array containing an object reference and a method name can also be supplied as the error_handler. - това се използва при твоя пример, но в мануалa пише че работи при 4.3.0, така че проблема може да е във версията ти......защото и функцията трябва да връща нещо си, пък тя връща null.....
а ако добавиш това
echo '<pre>';
var_dump($eh);
преди trigger_error, ще видиш че променливата error си е сетната правилно
Re: PHP OOP
Версията на PHP е 4.3.11, Apache 1.3.33, но не бих го нарекъл точно 'проблем'. По-скоро, не ми е ясен начина, по който php обработва класовете и обектите. Например, ако се даде референция към текущия обект:
set_error_handler(array(&$this, 'handler'));
и след това обекта се създаде чрез &:
....
$eh = &new error;
$eh->setText('Error!
');
trigger_error('text', E_USER_ERROR);
Тогава всичко работи нормално и резултата е:
Error!
!!?!!
Въпреки това, не ми става ясно защо е точно така, каква е разликата с горните примери и защо те се държат точно така. Просто не обичам да използвам неща, които не са ми ясни как работят.
set_error_handler(array(&$this, 'handler'));
и след това обекта се създаде чрез &:
....
$eh = &new error;
$eh->setText('Error!
');
trigger_error('text', E_USER_ERROR);
Тогава всичко работи нормално и резултата е:
Error!
!!?!!
Въпреки това, не ми става ясно защо е точно така, каква е разликата с горните примери и защо те се държат точно така. Просто не обичам да използвам неща, които не са ми ясни как работят.
Re: PHP OOP
Instead of a function name, an array containing an object reference and a method name can also be supplied as the error_handler.
може би това е тънкия момент и в setIni трябва да е
set_error_handler(array(&$this, 'handler'))...........
макар, че като се замисля имаше пък неква друга история за предаването на параметри по референс...
може би това е тънкия момент и в setIni трябва да е
set_error_handler(array(&$this, 'handler'))...........
макар, че като се замисля имаше пък неква друга история за предаването на параметри по референс...