В данной реализации поддерживаются PSR-0 и карты классов, загрузчики пространств имен и префиксов, кеширование в APC.
1. Карты классов:
classMapLoader::create(карта_классов, базовый_путь_к_файлам, пространство_имен)
Карта классов представляет из себя массив с классами в виде ключей и пути к файлам в виде значений.
Путь к файлу складывается из базового пути, разделителя и пути к конкретному классу.
<?php
use zeroclassMapLoader;
classMapLoader::create(array(
'className' => 'path/to/fileName.php',
'className2' => 'path2/to/fileName2.php',
), __DIR__.'/path/to/src', 'namespace');
2. Реализация загрузчика PSR-0:
Первым аргументом идет массив (префикс => путь), вторым — базовый путь.
<?php
// ZendFramework-1.11.11-minimal/zero-autoload.php
use zeropsr0Loader;
psr0Loader::create(array(
'Zend' => 'library',
), __DIR__);
<?php
// Twig-1.5.1/zero-autoload.php
use zeropsr0Loader;
psr0Loader::create(array(
'Twig' => 'Twig-1.5.1/lib',
), __DIR__);
3. Вложенные загрузчики:
Предыдущие два файла-загрузчика можно использовать в другом файле (prefixLoader в данном случае проверяет по префиксу, необходимо ли вообще загружать автозагрузчик зенда/твига):
<?php
use zeroprefixLoader;
prefixLoader::getInstance()->register(array(
'Twig' => 'Twig-1.5.1/zero-autoload.php',
'Zend' => 'ZendFramework-1.11.11-minimal/zero-autoload.php',
), __DIR__);
Для пространств имен можно также использовать namespaceLoader, например:
<?php
use zeronamespaceLoader;
namespaceLoader::getInstance()->register(array(
'namespace1' => 'path/to/autoloader1.php',
'name\space2' => 'path/to/autoloader2.php',
), __DIR__.'/path/to/src');
4. Кеширование
Реализован простой кеш в APC
В данном примере ключи в APC будут иметь вид prefixимя_класса (именно так, без пробела или подчеркивания):
<?php
use zeroapcClassMapLoader;
apcClassMapLoader::create('prefix');
Мысли по поводу реализации
* В стеке автозагрузки регистрируется только один объект — autoloadManager
* Все автозагрузчики автоматически регистрируются в autoloadManager при создании
* Простота записи (кратко, цепочки вызовов)
* Кеш также регистрируется в autoloadManager, опрашивается первым и получает результаты от других загрузчиков.
* Легко реализовать кеширование в любое key-value хранилище
* Гибкость — можно с легкостью подцепить как стандартные библиотеки, так и свои собственные и совсем левые без каких-либо стандартов.
* Модульность — можно разделить автозагрузчики по модулям, если модули не предусматривают строгой схемы именования файлов.
З.Ы. Возможно это будет цикл статей, описывающий разные (по началу мелкие) компоненты. Поэтому и «Часть 1»
Автор: w999d