Как-то в ходе работы мне пришлось писать CMS (и не одну, хотя с каждым апгрейдом они получались все лучше:)). Одними из многих требований были :

  1. Модульность, с легкой возможностью подключения и отключения модулей.
  2. Возможность дописывания модулей другими программистами, без доступа к ядру CMS (что подразумевало написания хорошего мануала).

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

Решений я видел несколько:

  1. Вставлять в ключевых местах CMS циклы с подключениями файлов модулей. Например, если существует файл в папке модуля с именем include_page.php то подключать его перед выводом страницы тем самым, создав этот файл, можно получить доступ к редактированию данных страницы. Но мне это решение не понравилось. Очень много файлов, да и не удобно, сложно управлять порядком подключения дополнительных файлов, плюс некоторые файлы могут конфликтовать, т.к. нет ни какой иерархии и архитектуры. В общем как идея она имеет место, но я ее не принял.
  2. “Якорная вставка функций” - это не научное название, просто я это так назвал:). И именно этот вариант я и выбрал. Сейчас расскажу как оно работает.

Смысл “якорной вставки функции”, как и в первом варианте, заключается в раставление в основных местах “функций якорей”, но в этом случае ни какие файлы не подключаются, а всего лишь запускаются функции, которые были добавлены в глобальный массив. Плюсы этого метода для меня были в том, что доступа как такового ко всем переменным нет. То есть - можно объявить в функции нужную переменную как глобальную, но это если ты знаешь ее, если нет, то и не нужно ее трогать. Таким образом, ни каких конфликтов не будет все используемые переменные внутри функции.

Код “якорной функции”:

function include_function()
{
	global $include_function; // массив в котором хранятся какие функции куда вставить (объявляется в начале CMS)
	$key=func_get_args(); // чтение аргументов функции, чтобы определить какой список функци запустить
	$functions=$include_function;
	if(count($key)>0)
	{
		foreach($key as $v)
		{
			if(is_array($functions[$v]))
				$functions=$functions[$v];
			else
				return;
		}
	}
	foreach($functions as $name)
	{
		if(is_string($name))
			$name(); // запускаются только строковые элементы массива во избежание ошибок.
			// Так как у меня в корневом уровне массива хранятся функции которые, запускаются в начале CMS,
			// а к примеру в элементе с ключом 'page' массив функций которые запускаются перед выводом страницы и т.д.
	}
}

Пример - нужен модуль новостей с выводом последних новостей на главной странице.

На главной странице я поставил “якорь”:

	include_function('index'); // запуск функций из массива $include_function['index']

В файле функций модуля создал функцию “news_index” которая собирает последние N новостей. Описывать эту функцию не буду, там используются функции CMS, ничего интересного, просто берутся последние новости и добавляются в шаблон…

В файле модуля config.php добавил-

	$include_function['index'][]='news_index';

Вот и все, что требовалось… Лично мне очень нравится эта маленькая PHP хитрость, а будите ли применять этот алгоритм Вы решайте сами;)