Улучшенная система PHP-хуков

Теги:

Ранее я уже писал заметку о хуках в PHP, о том, что это такое, и даже предлагал свой метод расширения возможностей уже объявленных функций. Как всегда, практика - критерий истины, и, начав применять этот метод на практике, я нашел его довольно сложным и муторным в применении, так как в каждую функцию в конце приходится встраивать довольно громоздкую конструкцию, указывая там и имя функции, и массив ее аргументов, и возвращаемое значение, не забыв получить еще и глобальный массив $hook (кто не в курсе, прочитайте оригинальную статью).

Порывшись в мануале, мне удалось модифицировать технологию, упростив в разы ее использование с помощью встроенной функции debug_backtrace(). В результате получилась вот такая функция:

function hook($result){
global $hook;
$d_backtrace=debug_backtrace();
$backtrace=is_array($d_backtrace[1])?$d_backtrace[1]:$d_backtrace;
$functions=@$hook[$backtrace['function']];
$args=$backtrace['args'];
if(is_array($functions)){
ksort($functions);
foreach($functions as $function)
if($function&&function_exists($function))
$result=$function($result,$args);
}
return $result;
}

Как и раньне, при этом подходе используется двумерный массив $hook, ключами первого уровня являются имена оригинальных функций, а значениями второго уровня являются имена хук-функций к ним.

В структуре хук-функций без изменений. Они принимают 2 параметра: возвращенное значение, и массив исходных аргументов.

Пример использования можно смотреть здесь.


Новые модели сотовых телефонов. Обзоры и цены.

Статьи схожей тематики:

Делаем поиск с подсветкой результатов

Neutrino Atomic Edition 0.8.7

Хуки в PHP

Предлагаю вашему вниманию...

PHPDL - скрипт для отображения директорий

Комментарии(4):

rss-лента

Добавлено: 2009-09-08 08:45:47, Katyusya

Действительно, это куда проще прежних "трехэтажных" хуков. Другое дело!

Добавлено: 2009-10-12 23:00:12, инт

хорошо, попробую, спс

Добавлено: 2010-04-04 11:01:36, dima

это все должен делать фремворк, а а не велосипеды писать...

Добавлено: 2010-05-02 12:27:56, olean

В корне не соглашусь с вами, dima.
Фреймворк - это временное общее решение, которое в последствии должно заменяться дедуктивным частным решением.

Добавить комментарий

Ваше имя:*
Ваш email:*(не публикуется)
Ваш блог:
Ваш комментарий:*

Переносы строк и url-адреса преобразуются автоматически, не забудьте отделить их пробелами. html и bb-коды не поддерживаются.