PHP
Автозагрузчик классов для PHP.
Автозагрузчик классов используется, обычно, в более-менее крупном проекте или таком, который имеет перспективы развития в дальнейшем. В настоящее время, при создании таких проектов, особой популярность пользуется концепция MVC (Model-View-Controller: модель-вид-контроллер). Поэтому рассмотрим способ организации автозагрузки в рамках данной структуры. Так же, в реальных проектах, желательно использовать пространства имен для избежания дублирования имен классов, констант и др.
Файл автозагрузчика классов (autoload.php) подключается в точке входа (файл index.php). Сам класс автозагрузчика регистрируется в начале запуска приложения после выполнения метода run() с помощью функции spl_autoload_register(), которая вызывает метод autoload() класса ClassLoader. Автозагрузчик классов вызывается автоматически каждый раз при вызове любого класса, который не был объявлен.
Для работы автозагрузчика, каждый подключаемый класс должен быть в отдельном php-файле, который называться должен аналогично названию класса. Например класс Config должен находиться в файле Config.php
Автозагрузчик прежде всего ищет запрашиваемый класс в карте классов, которая представляет собой ассоциативный массив, находящийся в отдельном файле vendor/classes.php. Он содержит названия классов в виде свойств массива и путь к файлам данных классов в виде значений. Например:
'Config' => 'library/Config.php'.
В карту сайта следует включить служебные классы, которые нужны для работы приложения. Карта классов используется для ускорения загрузки.
Не найдя класс в карте классов, вызывается дополнительный метод, который ищет файл класса в массиве дирректорий public static $dir. В данный массив следует включить названия основных папок, которые предназначены для создания в них файлов классов по ходу работы над созданием сайта.
При использовании концепции MVC, это прежде всего controller и model.
После использования обоих попыток подключить требуемый класс, проверяется объявлен ли он. И если нет – генерируется исключение с выводом соответствующего сообщения.
Структура каталогов/файлов:
- config
- db.php
- vendor
- autoload.php
- classes.php
- main.php
- controller
- MyController.php
- model
- view
- index.php
Рассмотрим код основных файлов.
index.php:
run();
В данном файле (точке входа) первым делом, создаем константу ROOT_DIR, которая будет использоваться для указания пути к корню приложения.
Далее загружаем файлы с классами, создаем объект приложения и вызываем метод, который вызывает и подключает все нужные для работы классы/методы, а прежде всего автозагрузчик классов.
vendor\autoload.php:
Это класс самого автозагрузчика, который ищет файл требуемого класса сначала в карте классов, а не найдя в списке директорий, указанных в свойстве $dir. Так же класс генерирует исключение в случае, если затребованный класс подключить не удалось.
Сама карта классов должна быть в таком формате (файл vendor\classes.php):
<?php
return [
'ConfigDb' => 'config/db.php',
'my\widgets\Menu' => 'widgets/Menu.php', //можно использовать пространства имен
'my\helpers\Html' => 'helpers/Html.php',
];
vendor\main.php
<?php
class Application {
public function run(){
$this->Loader();
//...
}
public function Loader(){
spl_autoload_register(['ClassLoader', 'autoload'], true, true);
try{
$config = new ConfigDb();
echo $config->get('database', 'login'); //mylogin
echo MyController::$params; //KSL
//Пример добавления каталога в автозагрузчик классов
//ClassLoader::$dir[] = 'view';
//Пример добавления класса MyClass к карте классов
//ClassLoader::$addMap['MyClass'] = 'folder/MyClass.php';
} catch (Exception $e){
echo '<h2>Внимание! Обнаружена ошибка.</h2>'.
'<h4>'.$e->getMessage().'</h4>'.
'<pre>'.$e->getTraceAsString().'</pre>';
exit;
}
}
}
Это основной класс приложения. В данном случае при его запуске из index.php, метод run() первым делом вызывает метод Loader(), который регистрирует наш автозагрузчик классов с помощью функции spl_autoload_register(), в которой указывается класс и метод самого автозагрузчика. В этот метод, данная функция, передает название вызываемого класса (или класса, экземпляр которого мы пытаемся создать).
Для примера, тут создается объект класса ConfigDb с вызовом его метода get(), возвращающего некоторые данные. Данный класс у нас прописан в карте классов и таким образом проверяем работу автозагрузчика по поиску в карте классов.
После этого, проверяем автозагрузчик на предмет поиска в списке указанных для этого директорий. Для этого вызываем статическое свойство $params класса MyController. Данный класс размещен в папке controller, которая включена в массив свойства $dir, а значит класс подключится на втором этапе поиска с выводом значения запрашиваемого свойства.
Другие статьи:
Спасибо все очень понятно.