Это ну практически максимально простой способ создания системы плагинов на основе хуков (hook) которую я смог придумать минут за пять. Для её полноценности её нужно ещё нормально доработать, но делать этого мы конечно же не будем. Однако в таком виде она тоже функционирует, это не совсем обычная концепция.
Мысль такая:
1. Создаём и подключаем класс, в который собираем все хуки и функции к ним закреплённые
2. Создаем в этом классе функцию при вызове которой вытаскивает все подвешенные хуки и запускает функции привязанные к ним
3. Вставляем куда надо вызов второй функции
4. Создаём плагины в которых накидываем функции на хуки
5. ???
6. Готово
Нам пригодится такая структура:
index.php
include
-- hook.class.php
plugins
-- test
-- -- plugin.php
Для начала откроем и опишем include/hook.class.php:
<?php class PM { private static $hooks = array(); //Массив, в котором будут находиться все хуки public static function Hook($hookName, $function) { //функция, которая собирает хуки в кучу self::$hooks[$hookName][] = $function; //записываем имя функции в отдельную ячейку для определённого хука } public static function runHook($hookName, &$variable = false) { //функция, которая будет запускать все функции прицепленные определённым хуком if (isset(self::$hooks[$hookName])) { //проверяем, есть ли такой хук воще foreach (self::$hooks[$hookName] as $f) { //начинаем пробегаться по всему что к этому хуку прикреплено if ($variable != false) { //Если хук с параметром, тогда call_user_func_array($f, array(&$variable)); } else { //Иначе мы просто так её запускаем call_user_func($f); } //if } //foreach } //if } //function runHook }
Теперь index.php:
<?php require_once("include/hook.class.php"); //Инклюдим класс с функциями хуков $menu_items = array( //Допустим у нас есть массив меню 100 => ['Главная', 'http://evilcoder.ru'], 200 => ['Не главная','http://evilcoder.ru'] ); PM::runHook('menu', $menu_items); //Вешаем хук на переменную $menu_items PM::runHook('info'); //Вешаем просто так хук, чтобы что-нибудь сюда выполнить foreach ($menu_items as $item) { echo "<p><a href='$item[1]'>$item[0]</a></p>"; }
По идее уже всё готово, наша примитивная система на хуках уже работает. При запуске мы увидим, как всё сейчас выглядит с пустыми хуками.
Ну наверное теперь нужно проверить как это всё работает, поэтому я изначально попросил создать папку plugins с плагином test внутри.
Откроем plugins/test/plugin.php и заполним чем-нибудь:
<?php function test(&$menu) { //функция которая добавит пунктов в меню $menu[300] = ['Плагин','http://evilcoder.ru']; $menu[400] = ['Пункт меню через плагин test','http://evilcoder.ru']; } PM::Hook('menu', 'test'); //Прикрепляем к хуку функцию test function info() { //Функция info которая без параметров. Сюда можно всякой разной дичи добавить global $info; //Можно например подцепиться к переменным которые находятся в той же области видимости как и runHook $info = 'Это из функции info на хуке info '; //Изменим ту самую переменную которая находится возле run echo "Тут какая-нибудь информация"; //Просто сделаем echo, почему бы и нет } PM::Hook('info', 'info'); //Цепляем функцию info к хуку info function style() { //добавим ещё функцию style к хуку info echo "<style>p > a{ font-size: 25px; color: #215289; }</style>"; } PM::Hook('info', 'style'); //прицепим её так же к хуку
Ну и под конец модифицируем index.php до такого состояния:
<?php require_once("include/hook.class.php"); require_once("plugins/test/plugin.php"); //Заинклюдим ещё сам плагин $menu_items = array( 100 => ['Главная', 'http://evilcoder.ru'], 200 => ['Не главная','http://evilcoder.ru'] ); $info = ''; //Создадим пустое $info PM::runHook('menu', $menu_items); PM::runHook('info'); //Вешаем просто так хук, чтобы что-нибудь сюда выполнить echo $info; //Выведем $info foreach ($menu_items as $item) { echo "<p><a href='$item[1]'>$item[0]</a></p>"; }
Ну и в итоге видим примерно такую картинку
Стили накинулись (хотя так делать со стилями неправильно, это только для теста), переменная изменилась, пункт в меню добавился, echo отпечатало
Вопросы, пожелания и всё такое Вы можете оставить прямо в комментах под статьей )