mecanism de pornire de clase în PHP

În acest articol vreau să-ți spun cum stau lucrurile cu clasele Autoîncărcarea în PHP, precum și abordarea comună în implementarea de pornire.

În codul PHP vechi practică comună a fost de a utiliza necesită, require_once, includ, include_once pentru a încărca fișiere care conțin clasele necesare, de exemplu:


astfel require_once la începutul fișierelor acumulat o sumă uriașă.

E rău? Da.

De ce? Pentru că:

- fișierele încărcate în orice caz, chiar și atunci când acest lucru nu a fost necesar
- a avut în mod constant pentru a scrie necesita / includ și ar putea uita cu ușurință pentru a conecta orice fișier
- în cazul deplasării unui fișier, a trebuit să schimbe toate legate de aceasta necesită

Aceste zile sunt de mult apuse, deoarece PHP 5 a venit mecanism autoloading și __autoload funcția (), care se numește de fiecare dată când creați un obiect de clasă necunoscută. Singurul lucru care a rămas dezvoltator, deci este să-l pună în aplicare, și nu mai avea nevoie de a scrie, și așa necesită:


deoarece Nu a fost anterior conectat oriunde fișier care conține clasa de utilizare, atunci __autoload funcția () este numit, care va fi dat numele clasei ca $ clasa parametru, și ea, la rândul său, va încerca să se conecteze un fișier care conține această clasă.

Această caracteristică vă permite să înregistrați orice funcție se face referire la ea ca un mecanism de implementare pentru clasele de pornire. Dacă o numim fără parametri, spl_autoload funcția () va acționa în calitate de punere în aplicare de pornire

Acest mecanism are un viraj, astfel încât să puteți înregistra mai mult de o funcție pentru a rezolva problemele de pornire clase. Toate funcțiile vor fi numite în ordinea înregistrării lor. De asemenea, cu versiunea 5.3 adaugă suport pentru namespace.

+ mecanism convenabil pentru clasele de pornire au finalizat implementarea standard

+ Fișierele sunt încărcate numai atunci când este necesar

+ nu este nevoie de a scrie o grămadă nevoie

Exemplele de realizare a clasei de pornire

Sugerez să se familiarizeze cu abordarea comună în punerea în aplicare a autoloaders și scrie opinia ta.

clase de înregistrare manuală pentru autoloading

Această metodă implică crearea unei singure Autoloader, cu clasele de înmatriculare ale acestora. Acest lucru poate avea loc după cum urmează:

În continuare, trebuie să vă înregistrați Autoloader nostru:

Mai departe spre utilizarea sa imediată. De exemplu, avem două clase de utilizator și a sarcinii, care sunt, respectiv, în /src/Model/User.php și /src/Model/Task.php, apoi să se întoarcă startup-ul lor, trebuie să facem următoarele:

apoi, în orice loc în care avem nevoie pentru a crea obiecte din aceste clase, pot scrie pur și simplu:

și metoda de lucru a Autoloader noastre autoload.

Această metodă nu este perfectă și are propriile sale avantaje:

+ în schimb necesită o dată constantă este suficient pentru a înregistra un tonomat de clasă

+ fișierele sunt încărcate numai ca acestea sunt necesare

+ în cazul fișierelor modificările locației, suficient pentru a schimba modul său într-un singur loc

+ vă permite să adăugați biblioteci terțe părți într-un proiect, avem nevoie doar adăugați clasele în avtoloadera hartă

- trebuie să vă înregistrați manual clasele

- Ea nu permite numele clasei pentru a determina rapid în cazul în care acesta este situat

nume de clasă ca cale de fișier indicii

Această metodă este folosită în clasele de pornire templating creanga, și a fost, de asemenea, utilizat în prima versiune a Zend Framework'e. Esența ei este faptul că însăși numele clasei indică dosarul în care fișierul care conține această clasă. Este ușor de înțeles cu un exemplu:

Pe baza acestui exemplu a scrie cu ușurință o funcție de clasa de pornire, în urma unui astfel de acord:

Toate lucrările sale se reduce la o singură acțiune - înlocuirea subliniere în numele clasei de a transmite slash, formând astfel o cale către fișierul. În acest exemplu, sunt specificate în mod rigid începutul de referință rădăcină de calea către sistemul de fișiere, îmbunătățirea acestui punct, am lăsa să conștiința cititorului.

Luați în considerare avantajele și dezavantajele autoincarcatorul.

+ nu este nevoie să se înregistreze manual clasele

+ Fișierele sunt incluse numai atunci când este necesar

+ numele fișierului este ușor să se determine în cazul în care acesta este

+ Aceasta exclude posibilitatea unor conflicte în nume de clasă, ca nu poate avea două fișiere cu același nume în sistemul de fișiere

- Nu există clase de sprijin de pornire care nu sunt următoarele acești termeni atunci când denumiți clase, cum ar fi nici un suport pentru namespace

- în cazul unei restructurări serioase a structurii folderului va trebui să rescrie toate numele clasei

clase de pornire folosind namespace

De la introducerea namespace în PHP, această metodă a devenit una dintre cele mai populare. Linia de jos este faptul că spațiile de nume trebuie să fie legată de un anumit director în sistemul de fișiere, și toate subfolderele / fișierele vor fi preluate automat. Mai jos este un exemplu simplificat al autoincarcatorul, susține namespace:

În continuare, ia în considerare exemplul utilizării acestui Autoloader:

În acest exemplu, am adăugat namespace model, care indică directorul src / model. Mai mult, atunci când vom crea un obiect de clasa Alias ​​\ robot, autoincarcatorul ia un șir de model \ robot. Ca parte Modelul calea format src / model, și de Robot - Robot.php, calea finală la clasa Robot obținut src / model / Robot.php.

Care sunt argumentele pro și contra acestei abordări?

+ namespace suport, care sunt utilizate în multe biblioteci moderne

+ namespace de înregistrare simplificată în comparație cu înregistrarea claselor în primul autoincarcatorul

+ nu există conflicte în numele de clasă, ca fiecare fișier trăiește în spațiile de nume

- trebuie să vă înregistrați namespace

P.S. Codul sursă al autoloaders articol, precum și exemple de utilizare a acestora pot fi văzute aici.

articole similare