Часто автозагрузка по умолчанию может вас не устраивать по каким-нибудь причинам. В таком случае можно написать свою автозагрузку.
Для этого в функцию 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);
});
?>
Потестируйте созданную мною функцию автозагрузки.
Придумайте свое правило автозагрузки и реализуйте его.