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