Своя функция для автозагрузки классов

Часто автозагрузка по умолчанию может вас не устраивать по каким-нибудь причинам. В таком случае можно написать свою автозагрузку.

Для этого в функцию spl_autoload_register нужно первым параметром передать написанную вами функцию-коллбэк. Эта функция будет вызываться, когда PHP будет обнаруживать обращение к незагруженному классу. В параметр этой функции будет попадать имя класса с пространством имен:

<?php spl_autoload_register(function($class) { // в переменной $class будет имя класса с пространством имен }); ?>

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

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

То есть, если у нас есть класс Core\Admin\PageController, то путь к нему должен быть Core/Admin/PageController.php.

Как вы видите, для преобразования имени класса с его пространством нужно просто поменять обратные слеши на прямые, а к имени класса добавить .php. Сделаем это:

<?php spl_autoload_register(function($class) { $filename = str_replace('\\', '/', $class) . '.php'; require($filename); }); ?>

У нас, однако, получится относительный путь к файлу (относительно корня сайта). Лучше сделать абсолютный путь, вот так:

<?php spl_autoload_register(function($class) { $root = $_SERVER['DOCUMENT_ROOT']; $filename = $root . '/' . str_replace('\\', '/', $class) . '.php'; require($filename); }); ?>

Есть еще нюанс. В разных операционных системах путь по папкам может быть с прямым слешем или с обратным. Сделаем наш код независимым от операционной системы. Для этого вместо прямого слеша для разделения путей будем ставить константу DIRECTORY_SEPARATOR, содержащую правильный слеш той операционной системы, в который сейчас запускается наш скрипт. В итоге получим следующий код:

<?php spl_autoload_register(function($class) { $root = $_SERVER['DOCUMENT_ROOT']; $ds = DIRECTORY_SEPARATOR; $filename = $root . $ds . str_replace('\\', $ds, $class) . '.php'; require($filename); }); ?>

Потестируйте созданную мною функцию автозагрузки.

Придумайте свое правило автозагрузки и реализуйте его.