Собствена функция за автоматично зареждане на класове в ООП в 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);
});
?>
Тествайте създадената от мен функция за автоматично зареждане.
Измислете собствено правило за автоматично зареждане и го реализирайте.