тк 3 июля праздник (в беларуси), буду не онлайн (по возможности буду отвечать)

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

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

Для этого в функцию 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) { $filename = $_SERVER['DOCUMENT_ROOT'] . '/' . str_replace('\\', '/', $class) . '.php'; require($filename); }); ?>

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

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

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

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