Buga

Что такое хуки и как это работает

Краткая описание основных механизмов работы

Все известные мне СМС WordPress, Drupal, Joomla включают в себя механизм хуков (hook). Я попытаюсь коротко объяснить, что этот за механизм.

Итак, каждый наш запрос на сайт запускает скрипт php который выполняется очень быстро, но все таки последовательно во времени. Составим примерный краткий план работы скрипта:

  1. init инициализация загрузка настроек сайта
  2. connectDB подключение к Базе данных
  3. request обработка запроса пользователя ( разбираемся, что от нас хочет пользователь)
  4. getData получение данных из БД
  5. work обработка данных
  6. html формирование HTML текста готовой страницы
  7. end завершение работы

Я как разработчик СМС заранее готовлю точки или правильнее сказать зацепки(hooks) в коде скрипта. Так например в первом пункте происходит инициализация настроек сайта, потом могут быть еще действия, а потом скрипт доходит до зацепки init и проверяет не добавил ли web программист (Вы) еще какие-то свои действия с данными в этой точке скрипта. Если добавил - то выполняем его действия и продолжим далее работу. Переходим ко второму пункту подключаемся к БД и опять проверяем нет ли дополнительных действий на хуке connectDB? Если есть то выполняем их и идем дальше. Все хуки в СМС задокументированы и расписаны в документации поэтому Вам (программисту), установившему смс, не надо вламываться в оригинальный код и что-то там исправлять под себя. Вам надо найти подходящий хук и к нему подключить свою функцию обработчик.

Подобный подход так или иначе реализован во всех СМС и фреймворк, а приведенный пример лишь общий план работы всех CMC. Вот например реальное число хуков в Wordpress уже достигло 2349. Пример для Buga: я (разработчик) устанавливаю хук в самом конце работы, когда уже готов результирующий html текст и передаю этот текст в hook :

doHook( 'end', $html ); 

А вот уже программист конкретного сайта может добавить к этому хуку свои действия : 

addHook('end', 'endFinally', 10000 ); 
function endFinally(&$html)
{ 
     $html .= 'Hello Buga'; 
} 

На словах это будет так - когда запустится хук end надо выполнить функцию endFinally в функцию передается один параметр $html текст , вот к этому тексту мы прибавим в конце Hello Buga. 10000 - означает порядковый номер хукфункции.

Чтобы не путаться с понятиями введем термин хукфукнция - это функция которая цепляется на хук :)