У меня есть веб-приложение на 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(){
}
}
Поскольку у меня уже есть немало кода, мой вопрос - есть ли альтернатива созданию всех модулей на основе классов, что позволяет избежать как проблемы конфликтов имен, так и позволяет мне в полной мере сохранить текущую систему модулей