Свая функцыя для аўтазагрузкі класаў у ААП у 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) {
$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);
});
?>
Пратэсціруйце створаную мной функцыю аўтазагрузкі.
Прыдумайце свое правіла аўтазагрузкі і рэалізуйце яго.