В моих приложениях у меня обычно есть файл setup.php
, который включает в себя все основные классы (т.е. фреймворк и сопутствующие библиотеки). Мои пользовательские классы загружаются с помощью автозагрузчика с помощью карты макета каталога.
Каждый раз, когда добавляется новый класс, я запускаю скрипт построителя командной строки, который сканирует все дерево каталогов в поисках классов моделей, а затем создает ассоциативный массив с именами классов в качестве ключей и путями в качестве значений. Затем функция __autoload ищет имя класса в этом массиве и получает путь включения. Вот код:
autobuild.php
define('MAP', 'var/cache/autoload.map');
error_reporting(E_ALL);
require 'setup.php';
print(buildAutoloaderMap() . " classes mapped\n");
function buildAutoloaderMap() {
$dirs = array('lib', 'view', 'model');
$cache = array();
$n = 0;
foreach ($dirs as $dir) {
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)) as $entry) {
$fn = $entry->getFilename();
if (!preg_match('/\.class\.php$/', $fn))
continue;
$c = str_replace('.class.php', '', $fn);
if (!class_exists($c)) {
$cache[$c] = ($pn = $entry->getPathname());
++$n;
}
}
}
ksort($cache);
file_put_contents(MAP, serialize($cache));
return $n;
}
autoload.php
define('MAP', 'var/cache/autoload.map');
function __autoload($className) {
static $map;
$map or ($map = unserialize(file_get_contents(MAP)));
$fn = array_key_exists($className, $map) ? $map[$className] : null;
if ($fn and file_exists($fn)) {
include $fn;
unset($map[$className]);
}
}
Обратите внимание, что соглашение об именовании файлов должно быть [class_name] .class.php. Изменения каталогов классов будут смотреться в autobuild.php
. Вы также можете запускать autobuilder из функции автозагрузки, когда класс не найден, но это может привести вашу программу в бесконечный цикл.
Сериализованные массивы чертовски быстры.
@ JasonMichael: PHP 4 мертв. Преодолей это.