<?php
/**
* Итак. Создадим абстрактный класс будующего модуля/сервиса
*
*/
abstract class myModule
{
/* приоритет очередности запуска */
public $priority;
/* Для общения модулей */
public static $buffer;
/* конструктор класса для установки дефолтов */
public function __construct() {
/* Дефолтовая установка приоритета */
$this->priority = 9;
/* проверяем на наличие метода инициализации класса
* Чтоб не трогать __construct
*/
if( method_exists($this, '__initialize') ) {
$this->__initialize();
}
}
/* Метод отработки модуля */
abstract public function run();
}
/*
Теперь создаём некий файл с именем класса,
только маленькими буквами.
Ну и внутри него сам класс^
имя_класса.module.php
*/
/* файл executer.module.php
* Имя класса состоит из имени файла без .modules.php
* и добавка _Module
*/
class Executor_Module extends myModule
{
/* Метод инициализации
* Если конечно нужен
*/
public function __initialize()
{
}
public function run()
{
echo 'Executor runing!!!';
}
}
/**
* Так вот... у нас есть некая специальная директория где все модули
* Теперь нам нужно из неё выгребсти все модули и запустить их
* Обязательно первая буква в названии класса большая, остальные маленькие
*/
/* полный путь к модулям */
$MODULES_DIR = './';
/* выгребаем содержимое директории */
$MODULES = glob( $MODULES_DIR . '*.modules.php' );
/* Наши модули
*
* Сруктура будет такой
*
* $MODULES_ARRAY[ приоритет запуска ][ имя модуля ] = объект модуля
*/
$MODULES_ARRAY = array();
if( !empty($MODULES) ) {
foreach($MODULES as $key=>$val) {
$module_file = str_replace( $MODULES_DIR, '', $val );
$module_name = str_replace( '.modules.php', '', $module_file );
/* Создаём имя класса */
$module_class_name = ucfirst( strtolower($module_name) ) . '_Module';
/* Проверяем наличие класса */
if( !class_exists($module_class_name) ) {
/* Грузим модуль */
require( $MODULES_DIR . $module_file );
/**
* Опять проверяем наличие класса
* Можно даже добавить else с выводом ошибки о отсутствии класса
*/
if( class_exists($module_class_name) ) {
/* Создаём экземпляр класса */
$_mod = new $module_class_name();
/* и добавляем его в банк модулей */
$MODULES_ARRAY[ $_mod->priority ][ $module_name ] = $_mod;
}
}
}
}
ksort($MODULES_ARRAY);
/*
* Затем после такой инициализации мы делаем в любом месте,
* там где нам нужно запустить все модули,
* отработку модулей
*/
foreach($MODULES_ARRAY as $priority=>$modules_list) {
foreach($modules_list as $key=>$val) {
if( is_object($val) ) {
$val->run();
}
}
}
/**
* Вот такой вот способ
* Конечно в некоторых местах нужно добавить болше проверок,
* Но то уже на личное усмотрение
*/