Постановка проблемы
Предположим, что проект большой и почти автономно развивающийся или просто плохая память:)
Вам вдруг захотелось избавиться от постоянного вопроса "случился ли require файла класса?"
Варианты решения
сперва глупые...
- Первый, который приходит в голову - сложить все классы в один большой файл.
С одной стороны - выход, с другой - приходиться загружать много ненужного кода.
[хотя некоторые уверены, что это дает прирост производительности]
- Второй, немного сложнее - написать класс, который зарегистрирует все классы (и файлы) и будет "шлюзом" перед обращением к классу.
- Третий, перехватить exception, notice, warning и fatal error.
Потом обработать и, исправив "на лету" проблему недостачи класса, загрузить файл, продолжить выполнение программы.
простейший четвертый
Сразу извиняюсь, что использую singleton - жалко память :)
файл autoloader.php
class autoloader {
// [синглтон] где хранится экземпляр класса
static private $class = false;
// [синглтон] точка входа в класс
public static function gate()
{
if( is_object( self::$class ) == false ){
self::$class = new self; }
return
self::$class;
}
// где будет карта папок
private $classFolders;
// тут соберем карту при инициализации экземпляра класса
function __construct()
{
$this->classFolders = array(
'controller' => array( 'namePostfix' => 'Controller', ),
'model' => array(),
);
}
/* "автопогрузчик" файлов */
public function autoLoader( $className )
{
// пробегаем по карте папок в поисках нужного файла
foreach( $this->classFolders AS $folder=>$it )
{
$path = $folder . '/' ;
$fileName = $path . $className;
// прикручиваем особый постфикс к файлу, если хочется конечно
if( isset( $it[ 'namePostfix' ] ) ){
$fileName .= $it[ 'namePostfix' ]; }
$fileName .= '.php';
// проверяем есть ли вообще файл
if( file_exists( $fileName ) ){
// загружаем файл
require_once( $fileName );
// срочненько прекращаем поиск по папкам и выходим return true;
}
}
return false;
}
/* end class */ }
/* и присваиваем нужное действие автозаргузчику */
function __autoload( $className )
{ autoloader::gate()->autoLoader( $className ); }
// понятное дело код можно разнести и оптимизировать под себя
Ну собсвенно и все. подргужаем файл autoloader.php в нужном месте и... Остается разложить одноименные классам файлы по папкам и забыть про то, что где-то что-то не подгрузилось.
Удачи в кодировании идей!