Прочитав этот хабратопик. Решил поделиться своим классом автозагрузчика (вдруг кому пригодится), который умеет рекурсивно искать нужные файлы, не только классы, но и любой другой, переданный ему файл, ну и если там где указано файл не найден, то производит поиск по всему серверу начиная от корня, если файл найден где-то не там, генерит соответствующее сообщение, умеет работать с пространством имен и логировать свои действия в случае необходимости.
<?php namespace youNameSpace { /** * Усовершенствованный класс автозагрузчик * * Умеет загружать как недостающие классы, так и указанные файлы.<br/> * Больше нет необходимости писать инклюды, достаточно вызвать<br/> * функцию автозагрузки и сказать ей имя и расширене файла,<br/> * а можно еще и дирректорию уточнить(иначе ищем из корня), и будет счастье. * * @author Автор: Барулин Максим * @version 1.0 * @copyright: Барулин Максим */ class Autoloader { /** *переменная, отвечающая за отладку * * @var type const * */ const debug = 0; public function __construct() { ; } /** * Функция прямого подключения класса или файла.<br/> * В случае неудачи, вызывает функцию рекурсивного поиска. * * @param string $file имя файла(без расширения) * @param string $ext расширение файла(без точки) * @param string $dir директория для поиска(без первого и последнего слешей) * * @return string * @return false * */ public static function autoload($file, $ext = FALSE, $dir = FALSE) { $file = str_replace('\\', '/', $file); if($ext === FALSE) { $path = $_SERVER['DOCUMENT_ROOT'] . '/classes'; $filepath = $_SERVER['DOCUMENT_ROOT'] . '/classes/' . $file . '.php'; } else { $path = $_SERVER['DOCUMENT_ROOT'] . (($dir) ? '/' . $dir : ''); $filepath = $path . '/' . $file . '.' . $ext; } if (file_exists($filepath)) { if($ext === FALSE) { if(Autoloader::debug) Autoloader::StPutFile(('подключили ' .$filepath)); require_once($filepath); } else { if(Autoloader::debug) Autoloader::StPutFile(('нашли файл в ' .$filepath)); return $filepath; } } else { $flag = true; if(Autoloader::debug) Autoloader::StPutFile(('начинаем рекурсивный поиск файла <b>' . $file . '</b> в <b>' . $path . '</b>')); return Autoloader::recursive_autoload($file, $path, $ext, $flag); } } /** * Функция рекурсивного подключения класса или файла. * * @param string $file имя файла(без расширения) * @param string $path путь где ищем * @param string $ext расширение файла * @param string $flag необходим для прерывания поиска если искомый файл найден * * @return string * @return bool * */ public static function recursive_autoload($file, $path, $ext, &$flag) { if (FALSE !== ($handle = opendir($path)) && $flag) { while (FAlSE !== ($dir = readdir($handle)) && $flag) { if (strpos($dir, '.') === FALSE) { $path2 = $path .'/' . $dir; $filepath = $path2 . '/' . $file .(($ext === FALSE) ? '.php' : '.' . $ext); if(Autoloader::debug) Autoloader::StPutFile(('ищем файл <b>' .$file .'</b> in ' .$filepath)); if (file_exists($filepath)) { $flag = FALSE; if($ext === FALSE) { if(Autoloader::debug) Autoloader::StPutFile(('подключили ' .$filepath )); require_once($filepath); break; } else { if(Autoloader::debug) Autoloader::StPutFile(('нашли файл в ' .$filepath )); return $filepath; } } $res = Autoloader::recursive_autoload($file, $path2, $ext, $flag); } } closedir($handle); } return $res; } /** * Функция логирования * * @param string $data данные для записи * * @return void * */ private static function StPutFile($data) { $dir = $_SERVER['DOCUMENT_ROOT'] .'/Log/Log.html'; $file = fopen($dir, 'a'); flock($file, LOCK_EX); fwrite($file, ('║' .$data .'=>' .date('d.m.Y H:i:s') .'<br/>║<br/>' .PHP_EOL)); flock($file, LOCK_UN); fclose ($file); } } \spl_autoload_register('youNameSpace\Autoloader::autoload'); } ?>
