[PHP] Доступ к члену класса из кэлбэка.

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

[PHP] Доступ к члену класса из кэлбэка.

Сообщение Хакер » 30.04.2007 (Пн) 18:33

Подобный топик я поднял на другом форуме. Но там тишина. Не думаю, что здесь много людей, хорошо знающих php, ибо тематика форума совсем не та, но всё-же:

...

Итак. Залив сайт на хостинг, где используется PHP5 (а не 4) я обнаружил, что сервер отвечает пустой страницей. "Трассирируя скрипты", перетавляя die("Exection at ".__LINE__); на строчку дальше и дальше, я выяснил что скрипт выполняется до конца.

Посколько вывод у меня буферизируется, и установлен кэлбэк, единственным местом, где происходит crash может быть только он.

Так как в OB-Callback-е глупо делать die-и и echo-ы, я поставил в самое начало
return "Возврат со строчки ".__LINE__;

Сделал запрос, получил "Возврат со строчки...". Точно также перемещая этот "брекпоинт" всё дальше и дальше, установил, после какой строчки сервер начинает отвечать не сообщением "Возвраст со строчки...", а пустой страницей.

Итак вот начало фунции-кэлбэка.

Код: Выделить всё
function __obcallbacker($bufferdata, $mode)
{

        global $relpath;
        global $page;
        global $config;
        global $userdata;

        $page->__auto_class_detection = ACD_MANUAL;
        return "Ура!!! Работает!!! Строчка ".__LINE__;


При таком положении "ретурна", сервер отвечает пустой страницей.

А при такой:
Код: Выделить всё
function __obcallbacker($bufferdata, $mode)
{

        global $relpath;
        global $page;
        global $config;
        global $userdata;
        return "Ура!!! Работает!!! Строчка ".__LINE__;
        $page->__auto_class_detection = ACD_MANUAL;

отвечает, как и положено, строчкой "Ура!!! Работает!!! Строчка ..."



Отсюда делаем вывод что падение происходит на инструкции
$page->__auto_class_detection = ACD_MANUAL;

Что может быть ошибочного в этой инструкции? Переменная $page "заглобалена", никто её нигде не unset-ит.

Ладно!, - подумал я, - проверим!.

Убрал нафиг буферизацию вывода, и тупо вызвал функцию __obcallbacker:
Код: Выделить всё
>>> БЫЛО <<<
$page = new CTemplater();
$page->acd(ACD_NORMAL);
ob_start("__obcallbacker");

>>>Стало<<<
$page = new CTemplater();
$page->acd(ACD_NORMAL);
die(__obcallbacker("asdffffasdfas",2));



Функция нормально сработала, и инструкция $page->__auto_class_detection = ACD_MANUAL; успешно выполнилась, и die(__obcallbacker("asdffffasdfas",2)) вывел мне то что я и ждал.


Злюсь :wall: и не понимаю, с какого такого фига обращение к члену класса из кэлбэка вызывает падение (с выдачей пустой страницы).

Причём именно на php5.

Под php4 всё работает как часы... и на Денвере, и на стороннем хостинге (в данном случае петерхосте)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 02.05.2007 (Ср) 22:52

Нет, ну это ведь никуда не годится. :twisted:

Поставив PHP5 на локальную машину я убедился что дело не в самой 5-ой версии. А в конкретном сервере, на котором ничего не работает.

Более того, я стал уже новым способом искать место краха.

Получается следующее:

Если в конец главного скрипта поставить строчку:

Код: Выделить всё
message("Всё работает!", "Тестинг");


то мы увидем соответствующее сообещение - значит крах нигде не происходит и всё работает как должно. Ура-ура-ура.

Вот код функции message:
Код: Выделить всё
function message($msg_text, $msg_caption)
{
        global $page_info;
        global $page;

        $page->destroy(TPL_DESTROY_OUT);
        $page->load_template('ep', 'emptypage');
        $page->load_template('msgbox', 'message');

        $page->set_vars(array(
        'FREE_CAPTION'       => $page_info['title'],
        'CONTENT_MSG_CAPTION'=> $msg_caption,
        'CONTENT_MSG_DATA'   => nl2br($msg_text)));

        $page->set_var_from_tpl('FREE_DATA', 'msgbox');

        $page->output('ep');
        exit;
}


Если в конец главного скрипта поставить строчку:

Код: Выделить всё
message("Всё работает!", "Тестинг");

...


А если мы вызов функции message заменим кодом функции message - то получаем пустую страницу.

Ну не бред ли? :x
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 115

    TopList