Система на основе модулей в PHP - как? - PullRequest
2 голосов
/ 31 августа 2011

У меня есть веб-приложение на PHP, где я создал небольшую модульную систему, которая в основном работает так:

Каждый модуль имеет свой собственный файл, имя файла может быть любым, но это не имеет значения (ради логики я назвал имя файла совпадает с именем модуля). Содержимое модуля может выглядеть так:

$MODULE["name"] = "some_module";
$MODULE["description"] = "This module does some things";
$MODULE["required"] = false;
$MODULE["module_specific_var"] = some_function_that_returns_some_value();

У меня есть глобальный массив $ MODULES, где я читаю все модули в:

foreach ($modules_list as $module_filename){
  if (isset($MODULE)) unset($MODULE);
  include($module_path."/".$module_filename);
  $MODULES[$MODULE["name"]] = $MODULE;
}

Теперь это довольно просто и более чем достаточно для моих нужд ... До сих пор ... Теперь мне нужна функция, специфичная для модуля, и она не работает с ассоциативными массивами (насколько я знаю). То, что я хотел бы, это что-то вроде способности $MODULES["name_of_module"]["name_of_module_specific_function"]();

Я знаю, что это может быть достигнуто с помощью ссылок на функции, и пока я использую include() для каждого модуля, любые функции, определенные в файлах модуля, будут доступны в глобальном пространстве - это может вызвать проблемы с именами, но это плохая идея.

В качестве альтернативы я делаю каждый модуль классом, что-то вроде:

class module_name {
  var $name = "some_module";
  var $description = "This module does some things";
  var $required = false;
  var $module_specific_var = some_function_that_returns_some_value();
  function module_specific_function(){
  }
}

Поскольку у меня уже есть немало кода, мой вопрос - есть ли альтернатива созданию всех модулей на основе классов, что позволяет избежать как проблемы конфликтов имен, так и позволяет мне в полной мере сохранить текущую систему модулей

Ответы [ 3 ]

3 голосов
/ 31 августа 2011

ОО это путь сюда.Создайте базовый класс Module и расширьте его, если вам нужны специфичные для модуля функции.

Если вы сопоставите имена классов с именами файлов, вы даже можете использовать автозагрузчик, поэтому вам не понадобится include() все.Также было бы неплохо иметь центральный класс Singleton для отслеживания экземпляров вашего модуля (чтобы избежать необходимости использовать глобальные переменные, что является устаревшей практикой).

1 голос
/ 21 апреля 2016

Я думаю, что что-то вроде модулей CommonJS или ES6 для PHP было бы неплохо.Уже несколько идей по этому поводу: https://groups.google.com/forum/#!topic/commonjs/sVkxbQtR-lw

0 голосов
/ 31 августа 2011
  1. Система модулей, основанная на простых функциях, трудно обслуживать - используйте объекты
  2. PHP, поскольку версия 5 может автоматически загружать модуль по его имени
  3. Использовать иерархическую систему - из абстрактного модуля или интерфейса,вы будете знать, на что способен этот модуль.
  4. Если у вас есть имя в переменной, вы можете создать экземпляр, подобный этому - $foo = new $bar()

, где $ foo - это новый экземпляр, а $ bar storeимя объекта

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...