Автозагрузка классов

Вы уже знаете, что чтобы воспользоваться каким-нибудь классом, мы должны подключить его через require. Когда в проекте очень много классов, то получается много подключений, которые очень неудобно писать и трудно контролировать.

Для решения такой проблемы в PHP была добавлена автозагрузка классов. Автозагрузка позволяет PHP автоматически загружать файл с классом при попытке обращения к этому классу в коде. Однако, просто так классы загружаться не будут - их необходимо разместить по папкам сайта специальным образом, следуя какому-нибудь соглашению об именах файлов и папок классов. Можно пользоваться встроенным в PHP соглашением, либо придумать свое и пользоваться им.

Давайте для начала разберем стандартное соглашение PHP. Это соглашение заключается в то, что если у нас есть некоторый файл с классом, то путь по папкам сайта к этому файлу должен совпадать с пространством имен файла, а имя файла должно совпадать с именем хранящегося в нем класса. При этом имена папок и файла должны быть в нижнем регистре.

Посмотрим на примере. Пусть у нас есть следующий класс:

<?php namespace Core\Admin; class PageController { } ?>

По соглашению данный класс должен располагаться в папке /core/admin/ в файле pagecontroller.php.

Давайте теперь в файле index.php используем наш класс, не подключая его через require, а используя автозагрузку. Для этого в начале файла, в котором вызываются классы, следует вызвать функцию spl_autoload_register. Сделаем это:

<?php spl_autoload_register(); // включаем автозагрузку $obj = new Core\Admin\PageController; // спокойно создаем объект ?>

В файле index.php включите автоматическую загрузку классов. Следуя соглашению об именах папок и файлов сделайте класс Core\User, класс Core\Admin\Controller и класс Project\User\Data. В файле index.php создайте объекты этих классов.

Замечания

Функция spl_autoload_register пишется только один раз в начале файла. Затем можно создавать столько объектов разных классов, сколько угодно, главное, чтобы их имена следовали соглашениям.

Функция spl_autoload_register пишется только в начале того файла, который вызывается через адресную строку браузера. То есть, если какой-то класс вызывает внутри себя другой класс или наследует от кого-то, а сам класс вызывается в другом файле, то spl_autoload_register нужно написать только в этом другом файле - в самом файле класса дублировать эту функцию не надо.