Решение увидел такое: при запуске первый раз(узнаем существует ли определенный файл), шаримся рекурсивно по каталогам проекта и если это пхп файл, ищем у него классы и интерфейсы(регулярка), пишем в массив вида ключ название класса, значение = путь и название файла. затем этот массив сериализуем и пишем в файл. регистрируем свой автолоад и вуаля. при создании автолоада, читаем файл и у нас массив этот на руках :) автолоад функция просто берет путь с него и инклудит. допиливать нужно дох чего. но как вам идея? хотя может и существует такое.
придумал по пути с работы домой. пришел, написал, запостил, ушел варить вареники
использование
<?php
define('ROOT_DIR', $_SERVER['DOCUMENT_ROOT']);
define('DEBUG', TRUE);
include 'autoload.php';
$autoloader = new Autoload();
$autoloader->registerAutoload();
?>
autoload.php
<?php
class Autoload
{
private $classes_file = '';
private $classes = array();
function __construct($autoload = 'cache/autoload')
{
$this->classes_file = ROOT_DIR . '/' . $autoload;
}
function existsClasses()
{
return file_exists($this->classes_file);
}
function readAutoload()
{
return unserialize(file_get_contents($this->classes_file));
}
function writeAutoload($classes = array())
{
return file_put_contents($this->classes_file, serialize($classes));
}
function getClassName($file)
{
$php_file = file_get_contents($file);
preg_match_all('#.*(class|interface)\s(\w+)#', $php_file, $classes_list);
if (count($classes_list) > 2 && isset($classes_list[2][0]))
{
return $classes_list[2];
}
else
return FALSE;
}
function scanClass($dir)
{
$dir_list = new DirectoryIterator($dir);
foreach ($dir_list as $file)
{
if ($file->isDir() && !$file->isDot())
$this->scanClass($file->getPathname());
if ($file->isFile() && strtolower(pathinfo($file->getFilename(), PATHINFO_EXTENSION)) == 'php')
{
$classes_list = $this->getClassName($file->getPathname());
if ($classes_list !== FALSE)
foreach ($classes_list as $class_name)
$this->classes[strtoupper($class_name)] = $file->getPathname();
}
}
}
function registerAutoload()
{
spl_autoload_register ('self::autoload');
if (!$this->existsClasses())
{
$this->scanClass(ROOT_DIR);
$this->writeAutoload($this->classes);
}
else
$this->classes = $this->readAutoload();
}
function autoload($class_name)
{
$class_name = strtoupper($class_name);
if (isset($this->classes[$class_name]))
include $this->classes[$class_name];
}
}
?>