Столкнулся с задачей, когда вывод в броузер всеми (ну или хотя-бы наиболее распространенными командами) должен производиться не напрямую а через другую функцию... т.е. процесс должен быть не таким: скрипт - echo (print и т.п.) - броузер а таким: скрипт - echo (print и т.п.) - ФУНКЦИЯ - броузер В функции производится некоторая окончательная обработка выводимых данных и потом уже их отдача в броузер. Пробовал воспользоваться простым объявлением глобальной функции для вывода Код (Text): function ФУНКЦИЯ($out) { обработка $out; echo $out; } , но заартачились прогеры - кто-то юзает простое echo, а кто-то предпочитает форматирование при выводе через print_r ... Попробовал переопределить через Код (Text): function ФУНКЦИЯ($out) { обработка $out; return $out; } ob_start("ФУНКЦИЯ") вроде ничего - всех устроила по использованию, но нашли грабли - не отрабатывает она ни по выводу echo, print (сначала копит где-то в своем буфере), ни по flush - а многие пользуют эту функцию для отдачи кода в броузер, еще на этапе работы скрипта (пока скрипт еще работает - часть данных уже идет - довольно актуально при медленном канале и/или длительной работе скрипта)... Пока с этим миримся, но тут еще и насели с запихиванием обработки перед выводом в класс - а вот с этим вообще вешалка - как переопределить вывод на метод класса... пока вариант придуман с глобальной переменой-указателем на класс и вызов через нее метода из глобальной функции Код (Text): $CLS = new cClass(); function ФУНКЦИЯ($out) { return $CLS->Функ($out); } class sClass() { function Функ($out) { обработка $out; return $out; } } последствия в случае совпадения имен глобальных функций, думаю, каждый может себе представить :evil: , если какаому-нить прогеру ударит в голову задать для своей функции такое-же имя (но с этим можно мириться, если административно обозначить екий набор "закрытых" имен, а в случае нарушения по шапке ему настучать - но неприятненько, все люди, в конце концов) Толковые идеи приветствуются. Основной упор нужно все-таки сделать именно на то, КАК можно заставить отрабатывать глобальную функцию вывода при каждом echo/print ну или хотя-бы по flush()
Да, еще тут на ухо нашептали, что может возникнуть ситуация, когда будет двойное переопределение - повтороное ob_start("...") вот тока с другой функцией - а это получится разрыв цепочки... а нужно, чтобы эта часть все-таки не терялась =( когда она будет отрабатываться - ДО или ПОСЛЕ нужной функции - это не суть, там в основном идет поиск некоторых сигнатур и внесение информации в БД о них...
То что вы делаете - ужас! Так нельзя. Займитесь проектированием всего приложения, а то складывается впечатление, что у вас "кто в лес кто по дрова". Вот решение для вашего (имхо клинического) случая. PHP: <?php function app_flush($buffer_on_exit=false) { if (isset($_SERVER['buffered_flag'])) { // нас уже вызывали ранее и у нас уже есть "своя" буферизация $buff = ob_get_contents(); ob_end_clean(); // очистим текущий буфер (он должен быть "наш", если какой-то урод не забыл закрыть свой) } else { if ($buffer_on_exit===false) { // первый вызов $_SERVER['buffered_flag'] = $buff = true; register_shutdown_function(__FUNCTION__); } else { // произошло завершение скрипта $buff = $buffer_on_exit; } } // если есть что обрабатывать - обрабатываем if (!is_bool($buff) and strlen($buff)) { echo "<<<\n".trim($buff)."\n>>>\n\n"; } // начинаем "свою" буферизацию ob_start(); } // ------------------------------------- app_flush(); print "1\n"; print "2\n"; app_flush(); print "3\n"; print "4\n"; app_flush(); // в конце вызывать необязательно, ведь мы уже об этом позаботились... ?> но тут нужно чтобы тот кто отрывал свои буфера между вызовами успевал их корректно закрыть, иначе собъется все.
хм... т.е. предлагаете вообще отказаться от обработчика??? а просто заставить всех юзать СВОЮ функцию отправки данных броузеру, в которой уже заведомо вызывать нужный метод класса (т.к. именно в класс решили запихнуть обработку) А по поводу бардака - практически так и есть... кто в лес, кто по дрова =((( - единственное, что есть, дык это некоторый базовый класс, от которого все наследуются =((( ЗЫ. Предопределять метод в базовом классе низя, потому и не писал об этом - причина запутанная и тут объяснять долго, но низя и все тут =(((
я для кого интересно написал эту функцию? это и есть обработчик. вместо вашего flush() его вызывайте...
вот про что я и грю - это вызываемыая функция взамен стандартной flush... а я грил про "обработчик событи" отправки данных =))) потому и пояснил, что предложение заключаетс в отказе от callback-функции, и ручном вызове написанной Вами =)
=))) не спорю, такой задачи пока не стояло, а вот возникла и мне досталась =) - изучаю, буду даж оч. непротив, если торнете носом в ссылку, где есть что толково и понятно почитать =) - мы люди не гордые, когда торкают в хорошие ресурсы =))))
Ну так... Открыл буфер в начале работы приложения... получил все данные закрыл буфер... получил данные из буфера... передал в ф-ю, а она пусть делает уже с инми все что ей хочется...