PHP OOP

3 отговора 170 прегледа
#1

PHP OOP

Здравейте, от коментарите из документацията на 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, и защо се получава гореописаното поведение ?.
Благодаря предварително.

Отговор
в отговор на Unit-731 #2

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 си е сетната правилно

Отговор
в отговор на пxп шмaтka #3

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!
!!?!!

Въпреки това, не ми става ясно защо е точно така, каква е разликата с горните примери и защо те се държат точно така. Просто не обичам да използвам неща, които не са ми ясни как работят.

Отговор
в отговор на Unit-731 #4

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'))...........
макар, че като се замисля имаше пък неква друга история за предаването на параметри по референс...

Отговор