Saját függvény az osztályok automatikus betöltéséhez OOP-ban PHP-ben
Gyakran előfordulhat, hogy az alapértelmezett autoloader valamilyen okból nem felel meg az elvárásainak. Ilyen esetben írhatunk egy saját autoloadert.
Ehhez a spl_autoload_register függvénynek
első paraméterként át kell adnunk egy általunk írt
callback függvényt. Ez a függvény akkor hívódik meg,
amikor a PHP észleli, hogy egy még betöltetlen osztályt
próbálnak használni. Ennek a függvénynek a paraméterébe
kerül az osztály neve a névterekkel együtt:
<?php
spl_autoload_register(function($class) {
// a $class változóban az osztály neve lesz a névterekkel
});
?>
A függvény feladata pedig, hogy az osztály neve alapján
betöltse az adott osztályt a require segítségével.
Vagyis ezen függvényen belül meg kell írnunk a saját
szabályunkat az osztályok betöltésére, azaz egy saját
elnevezési konvenciót.
Írjunk egy példát egy saját autoloaderre. Tegyük fel például, hogy azt szeretnénk, hogy az osztályfájl elérési útja a webroot könyvtárhoz képest ugyanaz legyen, mint a névtér, de a karakterek észlelésének megőrzésével.
Vagyis, ha van egy Core\Admin\PageController osztályunk,
akkor a hozzá tartozó elérési út Core/Admin/PageController.php
legyen.
Amint látható, az osztály nevének a névterekkel való átalakításához
egyszerűen a fordított perjeleket cserélni kell normál perjelekre,
majd hozzá kell fűzni az .php kiterjesztést. Valósítsuk ezt meg:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Azonban így relatív elérési utat kapunk a fájlhoz (a webroot könyvtárhoz képest). Jobb, ha abszolút elérési utat használunk, a következőképpen:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Van még egy árnyalata. Különböző operációs rendszerekben
a könyvtár elválasztójele lehet perjel vagy backslash.
Tegyük függetlenné a kódunkat az operációs rendszertől.
Ehhez a közvetlen perjel helyett a DIRECTORY_SEPARATOR
konstanst használjuk, amely tartalmazza az adott operációs
rendszernek megfelelő elválasztó karaktert, amelyen a szkriptünk
fut. Végül a következő kódot kapjuk:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Tesztelje a létrehozott autoloader függvényemet.
Találjon ki egy saját autoloader szabályt és valósítsa meg.