Полезности для php. Часть 1, Autoload

в 23:45, , рубрики: autoload, php, метки: ,

В данной реализации поддерживаются 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 хранилище
* Гибкость — можно с легкостью подцепить как стандартные библиотеки, так и свои собственные и совсем левые без каких-либо стандартов.
* Модульность — можно разделить автозагрузчики по модулям, если модули не предусматривают строгой схемы именования файлов.

исходники на GitHub

З.Ы. Возможно это будет цикл статей, описывающий разные (по началу мелкие) компоненты. Поэтому и «Часть 1»

Автор: w999d

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js