Автозагрузка классов
Готовый код можно скачать в моем репозитории на GitFlic.
Composer предоставляет четыре различных метода автозагрузки файлов, согласно официальной документации Composer, PSR-4
является рекомендуемым способом автозагрузки:
- Автозагрузка файлов
- Автозагрузка карты классов
- PSR-0 автозагрузка
- PSR-4 автозагрузка
Давайте опишем шаги, которые необходимо выполнить, если нужно использовать автозагрузку Composer:
- Создаем файл
composer.json
в корне проекта, он должен содержать директивы, основанные на типе автозагрузки -
После каждого изменения в файлах, нужно сгенерировать автозагрузку, в зависимости от того, глобально или локально у установлен composer:
php composer.phar dump-autoload
для локальной установкиcomposer dump-autoload
для глобальной установки
- Включите инструкцию
require __DIR__ . '/vendor/autoload.php';
в верхней части файла, в котором внужно использовать автозагрузку
Автозагрузка: Директива files
Автозагрузка файлов работает аналогично операторам include
или require
, которые позволяют загружать исходные файлы целиком. Все исходные файлы, на которые есть ссылка в директиве files
, будут загружаться при каждом запуске приложения. Это полезно для загрузки исходных файлов, в которых не используются классы.
Чтобы использовать автозагрузку файлов, укажите список файлов в директиве files
файла composer.json
, как показано в следующем фрагменте:
composer.json{
"autoload": {
"files": ["files/TestFiles.php"]
}
}
В директиве files
нужно предоставить список файлов, которые хотим автоматически загрузить с помощью Composer. После того, как создадите файл composer.json
в корне проекта с указанным выше содержимым, нужно запустить команду composer dump-autoload
для создания необходимых файлов автозагрузчика. Они будут созданы в каталоге vendor
. Осталось включить инструкцию require require __DIR__ . '/vendor/autoload.php';
в верхней части файла,
в который нужно автоматически подгружать файлы с помощью Composer, как показано в следующем фрагменте:
index.html<?
require 'vendor/autoload.php';
Автозагрузка: Директива classmap
Нужно предоставить список каталогов, и Composer просканирует все файлы в этих каталогах. Для каждого файла Composer составляет список классов, содержащихся в этом файле, и всякий раз когда требуется один из этих классов, Composer автоматически загружает соответствующий файл:
composer.json{
"autoload": {
"classmap": ["classmap"]
}
}
Автозагрузка: PSR-0
В стандарте PSR-0
должны использовать пространства имен для определения библиотек. Полное имя класса должно отражать структуру Vendor_Name\Namespace\Class_Name
. Кроме того, классы должны быть сохранены в файлах, имеющих ту же структуру каталогов, что и у пространств имен.
Давайте рассмотрим следующий файл composer.json
:
composer.json{
"autoload": {
"psr-0": {
"Tutsplus\\Library": "psr0"
}
}
}
При автозагрузке PSR-0
вам необходимо сопоставить пространства имен с каталогами. В приведенном выше примере мы говорим Composer, все что начинается с пространства имен Tutsplus\Library
, должно быть доступно по пути psr0/Tutsplus/Library
.
Если хотим определить класс TestPsr0
в каталоге psr0/Tutsplus/Library
, необходимо создать файл psr0/Tutsplus/Library/TestPsr0.php
, с пространством имен как показано в следующем фрагменте:
psr0/Tutsplus/Library/TestPsr0.php<?
namespace Tutsplus\Library;
class TestPsr0
{
//...
}
Для обращения к классу в нужном файле нужно написать следующие строки:
index.php<?
require 'vendor/autoload.php';
$objFoo = new Tutsplus\Library\TestPsr0();
Автозагрузка: PSR-4
PSR-4
похож на автозагрузку PSR-0
, нужно использовать пространства имен, но не нужно имитировать структуру каталогов с помощью пространства имен.
composer.json{
"autoload": {
"psr-4": {
"Tutsminus\\Library\\": "psr4/Test/"
}
}
}
Мы добавили обратную косую черту в конце пространств имен. Приведенное выше отображение сообщает Composer, все что начинается с пространства имен Tutsminus\Library
, должно быть доступно в каталоге psr4/Test/
.
Для обращения к классу в нужном файле нужно написать следующие строки:
index.php<?
require 'vendor/autoload.php';
$objFoo = new Tutsminus\Library\TestPsr4();
PSR-4
дает гораздо более простую структуру каталогов, поскольку вы можете не создавать вложенные каталоги, но при этом использовать полные пространства имен.