Sopstvena funkcija za automatsko učitavanje klasa u OOP u PHP-u
Često vas podrazumevano automatsko učitavanje može ne zadovoljavati iz nekih razloga. U takvom slučaju možete napisati sopstveno automatsko učitavanje.
Za ovo u funkciju spl_autoload_register
treba da prosledite vašu funkciju-povratni poziv kao prvi parametar.
Ova funkcija će biti pozvana
kada PHP detektuje pristup
neuočenoj klasi. U parametar ove funkcije
će stići ime klase sa prostorom imena:
<?php
spl_autoload_register(function($class) {
// u promenljivoj $class će biti ime klase sa prostorom imena
});
?>
A obavezom funkcije će biti da po imenu klase
izvrši učitavanje te klase putem require.
To jest unutar ove funkcije treba da napišemo
svoje pravilo za učitavanje klasa, odnosno
svoju konvenciju imenovanja.
Hajde da napišemo primer neke sopstvene automatske učitavanja. Neka, na primer, kažemo da će putanja do fajla klase od korena sajta biti ista kao i prostor imena, ali sa očuvanjem veličine slova.
To jest, ako imamo klasu Core\Admin\PageController,
onda putanja do nje treba da bude Core/Admin/PageController.php.
Kao što vidite, za transformaciju imena klase
sa njenim prostorom imena treba samo da zamenite
obrnute kose crte pravim, a imenu klase
dodate .php. Učinimo ovo:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Međutim, dobićemo relativnu putanju do fajla (relativno u odnosu na koren sajta). Bolje je napraviti apsolutnu putanju, ovako:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Postoji još jedan nijans. U različitim operativnim sistemima
putanja po fasciklama može biti sa kosom crtom
ili obrnutom kosom crtom. Učinimo naš kod nezavisnim
od operativnog sistema. Za ovo umesto
kose crte za razdvajanje putanja stavljamo
konstantu DIRECTORY_SEPARATOR,
koja sadrži odgovarajući separator za operativni sistem
u koji se trenutno pokreće naš
skript. Na kraju dobijamo sledeći kod:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Testirajte sopstvenu funkciju automatskog učitavanja koju sam napravio.
Osmislite sopstveno pravilo automatskog učitavanja i implementirajte ga.