Osztályok automatikus betöltése az OOP-ban PHP-ben
Már tudod, hogy egy osztály használatához
be kell töltenünk azt a
require segítségével. Amikor egy projektben
nagyon sok osztály van, akkor sok
betöltési utasítás gyűlik össze, amiket nagyon kényelmetlen
írni és nehéz ellenőrizni.
A probléma megoldására a PHP-ben hozzáadták az osztályok automatikus betöltését. Az automatikus betöltés lehetővé teszi a PHP számára, hogy automatikusan betöltse a fájlt az osztállyal, amikor az kódban az osztályhoz próbálnak hivatkozni. Azonban az osztályok egyszerűen maguktól nem töltődnek be - ezeket speciális módon kell elhelyezni a webhely mappáiban, valamilyen megállapodást követve a fájl- és mappanevekről az osztályok számára. Használhatjuk a PHP-be épített megállapodást, vagy kitalálhatunk egy sajátot és azt használhatjuk.
Kezdjük a standard PHP megállapodással. Ez a megállapodás abból áll, hogy ha van egy fájlunk egy osztállyal, akkor a webhely mappáin belüli út ehhez a fájlhoz egybe kell essen a fájl névterével, a fájl neve pedig egybe kell essen a benne tárolt osztály nevével. Eközben a mappák és a fájl nevének kisbetűseknek kell lenniük.
Nézzünk egy példát. Tegyük fel, hogy a következő osztályunk van:
<?php
namespace Core\Admin;
class PageController
{
}
?>
A megállapodás szerint ennek az osztálynak a
/core/admin/ mappában kell elhelyezkednie
a pagecontroller.php fájlban.
Most használjuk a index.php fájlban
az osztályunkat anélkül, hogy a require segítségével
töltöttük volna be,
hanem az automatikus betöltést használva. Ehhez a fájl elején,
amelyben az osztályok meghívásra kerülnek,
meg kell hívni a spl_autoload_register függvényt.
Tegyük ezt meg:
<?php
spl_autoload_register(); // bekapcsoljuk az automatikus betöltést
$obj = new Core\Admin\PageController; // nyugodtan létrehozhatunk egy objektumot
?>
A index.php fájlban kapcsolja be az osztályok automatikus
betöltését. A mappa- és fájlnevekre vonatkozó megállapodást követve
készítse el a Core\User osztályt,
a Core\Admin\Controller osztályt és a
Project\User\Data osztályt.
A index.php fájlban
hozzon létre objektumokat ezekből az osztályokból.