Oma funktsioon klasside automaatseks laadimiseks OOP-s PHP-s
Sageli võib vaikimisi automaatne laadimine teid mingil põhjusel ei sobi. Sellisel juhul saate kirjutada oma automaatse laadimise.
Selleks tuleb funktsiooni spl_autoload_register
edastada esimese parameetrina teie poolt
kirjutatud callback-funktsioon. See funktsioon kutsutakse välja,
kui PHP tuvastab viite
laadimata klassile. Selle funktsiooni parameetrisse
läheb klassi nimi koos nimeruumiga:
<?php
spl_autoload_register(function($class) {
// muutujas $class on klassi nimi koos nimeruumiga
});
?>
Funktsiooni kohustuseks on klassi nime põhjal
laadida see klass läbi require.
See tähendab, et selle funktsiooni sees peame määrama
oma reegli klasside laadimiseks, st
oma nimetamise kokkuleppe.
Kirjutame näite mõnest oma automaatse laadimise funktsioonist. Oletame näiteks, et me ütleme, et faili tee klassini saidi juurest on sama, mis nimeruum, kuid säilitades sümbolite registri.
See tähendab, kui meil on klass Core\Admin\PageController,
siis tee selle peaks olema Core/Admin/PageController.php.
Nagu näete, klassi nime teisendamiseks
koos selle nimeruumiga tuleb lihtsalt asendada
tagurpidi kaldkriipsud otsekaldkriipsudega ja klassi nimele
lisada .php. Teeme selle:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Meil saab aga faili suhteline tee (saidijuure suhtes). Parem on teha absoluutne tee, nagu nii:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
On veel üks nüanss. Erinevates operatsioonisüsteemides
võib kaustade tee olla otsekaldkriipsuga
või tagurpidi kaldkriipsuga. Teeme oma koodi sõltumatuks
operatsioonisüsteemist. Selleks asemel,
et kasutada otsekaldkriipsu teede eraldajana, kasutame
konstandit DIRECTORY_SEPARATOR,
mis sisaldab õiget kaldkriipsu selle operatsioonisüsteemi
jaoks, milles meie skript praegu käivitatakse. Lõpuks saame järgmise koodi:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Testige minu loodud automaatse laadimise funktsiooni.
Mõelge välja oma automaatse laadimise reegel ja rakendage see.