prefață
Modern web-aplicații constau de obicei dintr-o multitudine de clase, fiecare dintre care rezolvă anumite sarcini.
Deci, în mod implicit, în cazul în care unele aplicații noastre trebuie să folosim o clasă de, să zicem, Clasa_Mea. trebuie să ne asigurăm că fișierul care descrie clasa a fost conectat anterior cu require sau includ:
Ie fiecare clasă (precum și interfața și așa mai departe.), vom utiliza în aplicația dvs., trebuie să „conecta“ sau în avans „de-a lungul drum.“ Una dintre probleme este că aplicațiile de multe ori nu au o structură liniară, și nu întotdeauna putem ști dinainte care dintre multitudinea de clase (care ar putea fi folosit în timpul executării scriptului) vor fi implicate într-adevăr, și ceea ce - nu. Conectarea în avans toate clasele potențial utilizate duce la o utilizare ineficientă a resurselor de stocare, și clase de dreapta „manual“ conexiune „de-a lungul drum“ este de natură să conducă la utilizarea decembrie trucuri sub formă de inspecții ale condițiilor și includerea operatorilor, și în consecință - complexitatea codului, și lizibilitatea slabă.
În acest articol ne vom concentra tocmai pe încărcarea automată a claselor în aplicații PHP.
înseamnă SPL
În PHP (începând la versiunea 5) a existat o mare oportunitate de a descărca automat clase încărcate anterior. Ie atunci când interpretorul PHP întâlnește referințe în codul unei clase, ea poate fi, teoretic, încurajat să încerce să încarce clasa specificată. Cu toate acestea, pentru a face posibil acest lucru, mai avem de a descrie o funcție anumită (metodă) care definește exact unde descrierea clasei dorite. De obicei, acesta este un încărcător funcție.
Nu vom lua în considerare aici utilizarea Fct __autoload (); t. Pentru a. Această cale este acum considerat oarecum depășite și aproape complet înlocuite peste tot prin intermediul unui set de SPL.
Descrie și înregistrați funcția încărcător în mai multe moduri, cum ar fi:
Funcția standard de spl_autoload_registered (); Vă puteți înregistra funcția încărcător în toate __autoload (). t. e. să se înregistreze un încărcător funcție definită de utilizator, cum ar fi încărcător auto. În teorie, putem înregistra și mai multe funcții downloader, dacă este necesar. În exemplul nostru, înregistrăm unele funcții anonime care va efectua clasa de încărcare pe numele clasei a transferat-l.
Acesta funcționează în felul următor:
Când PHP interpretul se va întâlni în numele de cod necunoscut al clasei, va încerca să-l încărcați în serie cu ajutorul tuturor acestor autoloaders înregistrate. Ie fiecare funcție-loader la un moment dat ca parametru (în acest caz - $ classname) vor fi transferate pe deplin * numele acestei clase „necunoscute“, atunci încărcătorul funcție ar putea încerca să găsească acc. fișier care descrie această clasă și porniți-l. Dacă nici unul dintre înregistrate downloaders F-tiile nu a putut găsi și conectați clasa, în cele din urmă va fi aruncat de eroare pe care o clasă nu a fost găsit.
În acest exemplu, avem că în fișierele noastre aplicație cu descrierea claselor sunt aranjate într-un anumit dosar / my_classes_folder /. și chiar numele de fișier de clasă trebuie să se potrivească cu numele clasei în sine. Ie în conformitate cu acordul nostru, pentru a găsi și descărca exemplu, Clasa_Mea avem nevoie pentru a adăuga la calea / my_classes_folder / numele clasei (Clasa_Mea), apoi se adaugă extensia .php și includ cu ea nevoie. Ce este, de fapt, în exemplul descris mai sus. Toate verificările pentru existența unor fișiere și căi, respectiv, și așa mai departe sunt omise aici din motive de simplificare.
Cu toate acestea, chiar și aici există nuanțe, de exemplu, în cazul în care clasele în anexă au o anumită structură ierarhică complexă sau nu este concentrată într-un sub-dosar, sau care nu fac obiectul unor astfel de acorduri. Ca o opțiune poate fi considerat un fel de cartografiere a claselor și căi de fișiere cu descrierea lor, dar această opțiune are neajunsurile sale și poate, în unele cazuri, au o implementare destul de complexă.
Namespaces, PSR-0 și PSR-4
Începând cu versiunea 5.3 PHP a devenit un pic mai aproape de alte limbaje de programare avansate, și în același timp, adaugă suport pentru spații de nume (namespace). În contextul problemei noastre este în primul rând înseamnă că pentru fiecare clasă (interfață, impurități), ne-am dobândit, de asemenea, capacitatea de a specifica locul său în ierarhia generală a claselor.
Să presupunem că clasa MyClass noastră aparține unui anumit grup de clase utilitare (auxiliare), adică partea subgrupului Utilities. care, la rândul său, este inclus in total MyClasses subgrupului:
Ca astfel de inovații pot ajuta la rezolvarea unora dintre problemele menționate anterior?
Luați în considerare acest exemplu de Clasa_Mea de clasă, în cadrul unui încărcător funcție anonimă descrisă mai sus. Să începem cu faptul că numele complet al clasei, în cazul nostru actual este format din spațiul de nume + numele clasei, și anume - .. \ MyClasses \ Utilities \ Clasa_Mea. Și este în această formă, acesta va fi transmis în Kutch-ve parametru real la o funcție-încărcător. Aceasta este, folosind vechiul sistem fără schimbare vom obține, de fapt, o cale spre descrierea clasei: /my_classes_folder/MyClasses\Utilities\MySlass.php
Și dacă înlocuim toate backslashe la normal în această linie? Ajungem sa se uite la o cale tipică constând dintr-o ierarhie de foldere și fișiere MyClass.php la sfârșitul anului.
Modificăm resp. fel codul nostru încărcător Fct:
concluzie:
Putem plasa cursuri de aplicația noastră acc. foldere și subfoldere, ca și în cazul în care repetarea structura spațiului de nume aplicației noastre, și, prin urmare, o simpla transformare a numelui de clasă completă, vom putea primi o cale parțială sau completă la fișierul cu descrierea clasei.
Astfel, am ajuns la o abordare mai modernă a clasei de pornire, care se bazează pe standarde-PSR-0 / PSR-4. Să considerăm un exemplu simplu al unei clase care implementează un mecanism similar pentru standardul de pornire PSR-0.
Mai jos, de asemenea, da un exemplu de utilizare a autoincarcatorul în codul de aplicare:
Mai jos este o scurtă trecere în revistă a scopului metodelor de clasă Autoloader de mai sus. Clasa folosește modelul „singuraticul.“ de ce asa? De fiecare dată când creează o nouă instanță a clasei, metoda de încărcare a acesteia () va fi înregistrată ca autoincarcatorul. Nu trebuie să se înregistreze aceeași funcție ca un încărcător de mai multe ori pentru că suntem atât de aproape ocazia.