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