Добро пожаловать на сайт m15.ru !

Статьи по богословию, философии и истории. Разработка и поддержка веб-сайтов.
версия для печати

m15.ru

структурированию поддается все...

автозагрузчик классов в php

Постановка проблемы

Предположим, что проект большой и почти автономно развивающийся или просто плохая память:)

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

Удачи в кодировании идей!


Valid HTML 4.01 Strict Правильный CSS!