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