U svakom iole ozbiljnijem bavljenju PHP programiranjem imate potrebu da definišete manji, ili verovatnije, veći broj sopstvenih klasa. Svaku vašu klasu ćete najverovatnije pisati i čuvati u zasebnom PHP fajlu, koji je nakon toga neophodno da uključite u svaku PHP skriptu gde ćete koristiti datu klasu. Kod većih PHP softvera broj PHP skripti i njihovih međuzavisnosti raste eksponencijalno, što otežava praćenje kada je koja klasa neophodna. Koncept autoloadinga je uveden kako bi se rešio ovaj problem.
Primer standardnog uključivanja klase:
proba.class.php:
<?php
class Proba {
function Ispis(){
echo “A”;
}
}
?>
index.php:
<?php
require(“proba.class.php”);
$Proba=new Proba();
$Proba->Ispis();
?>
Na ekranu će se ispisati “A”.
Ovo je prost primer i uključivanje klase proba je jednostavno. Međutim, kako budete dodavali sve više frontend PHP skripti koje se međusobno uključuju require / include direktivama, i koje koriste sve veći broj klasa, doći ćete u situaciju da više niste sigurni koje su vam sve klase potrebne i u kom trenutku (neke klase se možda koriste samo pod određenim uslovima).
Jedno rešenje je da “za svaki slučaj” uključite sve (ili veći broj) klasa. Pametnije ali zahtevnije rešenje bi bilo da pažlivo vodite računa koje klase se pozivaju u kom PHP fajlu i da samo njih uključujete, sa ciljem da smanjite uvlačenje nepotrebnih klasa i opterećenje PHP interpretera.
Od PHP 5 nam je dostupno jedno još pametnije rešenje – autoloading. Ovaj koncept ima za cilj da programerima omogući da više ne moraju da vode računa o tome koje klase je neophodno uključivati gde. Preko magične __autoload() funkcije možete svoje PHP softvere da naučite kako da sami uključuju klase koje su im potrebne i to u trenutku kada su im potrebne.
Ukoliko ste definisali __autoload metodu, PHP će prvo nju pozvati kada pokušate da instancirate nepostojeću klasu, pa će tek onda baciti fatal error ako je i tu ne nađe. Kao parametar se automatski prosleđuje ime klase čije je instanciranje omanulo, i od programera se očekuje da na osnovu tog imena uključi odgovarajući PHP fajl sa definicijom klase.
Primer skripte sa korišćenjem magične __autoload() metode:
index.php:
<?php
function __autoload($imeKlase) {
require_once $imeKlase . ‘.class.php’;
}
$Proba=new Proba();
$Proba->Ispis();
?>
Ova skripta će takođe ispisati “A”, iako ovoga puta nigde nije eksplicitno naveden
require(“proba.class.php”);
Prilikom pokušaja instanciranja Proba klase, PHP će shvatiti da ta klasa nije definisana pa će pozvati __autoload() gde smo napravili logiku koja će (u ovom sllučaju uspešno) pokušati da uključi ispravnu definiciju klase.
Ali priča se tu ne završava – od verzije PHP 5.1.2. je kroz SPL (Standard PHP library) dostupna
spl_autoload_register()
metoda koja zamenjuje magičnu __autoload() metodu.
__autoload() je zvanično proglašena za zastarelu (deprecated) i preporučuje se da se isključivo koristi spl_autoload_register().
Koncept je praktično isti, samo što se sada ne koristi magična metoda fiksiranog imena, već možete da definišete proizvoljan broj svojih metoda, i da ih kroz spl_autoload_register() dodajete u niz metoda koje će biti redom pozivane ukoliko ne postoji klasa čiji objekat pokušavate da instancirate. Možete da definišete redosled kojim se funkcije koje pokušavaju da učitaju definiciju klase pozivaju, i tako na pregledan način napravite logiku za pronalaženje potrebne klase.
Primer autoloading-a kroz spl_autoload_register():
index.php
<?php
function DodajKlasu($imeKlase) {
require_once $imeKlase . ‘.class.php’;
}
spl_autoload_register(“DodajKlasu”);
$Proba=new Proba();
$Proba->Ispis();
?>
Koncept izvršavanja je isti kao u prethodnom primeru, sa razlikom što se ovde koristi spl_autoload_register(). U slučaju da nam se klase nalaze u nekoliko različitih direktorijumima, možemo da definisemo više metoda od kojih će svaka da pokuša da pronađe definiciju klase u odgovarajućem folderu, i da ih dodamo željenim redosledom kroz spl_autoload_register().
Jedno od važnih pitanja je da li korišćenje autoloadinga dodatno opterećuje aplikacione servere? Odgovor je – praktično ne. U praksi, cena učitavanja definicija klasa sa diska je mnogo veća od proračuna gde se te klase nalaze. Zapravo u praksi autoloading može i da smanji opterećenje servera na kome se “vrti” PHP. Sa obzirom da struktura PHP skripti i klasa često ume da bude vrlo duboko ulančana, broj klasa koje se nepotrebno uključuju sa diska može da bude prilično veliki. Autoloading obezbeđuje da uključujemo samo one klase koje se zaista koriste u toku izvršavanja datog PHP softvera.
Ovo je tek početak priče o autoloadingu u PHP-u, u nekom od sledećih blogova možda pokrijemo dalju razradu. Onima koji ne žele da čekaju mogu da preporučim da se upoznaju sa PSR-0 standardom imenovanja klasa i njihove hijerarhije. Ovaj standard je definisala PHP Framework Interop Group sa ciljem da se omogući standardizacija autoloadinga i njegova implementacija kroz različite framework-e:
http://www.php-fig.org/psr/psr-0/
Svaka cast na ovom uputstvu. Ovo je odlicno.
Mozes li da napises nesto o Hbase, ako znas? Hvala