Dacă ați terminat toate cele trei lecții anterioare, sunteți deja familiarizați cu conceptele de bază ale OOP din PHP: clase, obiecte, metode, câmpuri și moștenire. În această ultimă lecție, voi încerca să finalizez subiectul programării orientate pe obiecte în PHP și vă voi prezenta și câteva proprietăți PHP extrem de utile legate de OOP:
- Cum se încarcă automat clasele;
- Cum se convertesc obiectele într-un șir și un șir în obiecte pentru stocare și transfer ușor;
- Cum puteți obține informații detaliate despre o anumită clasă sau obiect.
Încărcarea automată a clasei
De obicei, este util să stocați fiecare clasă PHP într-un fișier separat. De exemplu, în aplicația pentru forum web, ați stocat clasa Membru în fișierul Member.php și clasa Topic în fișierul Topic.php. Cel mai probabil, veți stoca toate aceste fișiere în folderul de clase undeva pe site:
Apoi, dacă aveți nevoie pentru a crea un obiect de clasă, de exemplu, Membru, PHP, va trebui mai întâi să atașați un fișier cu această clasă:
Păstrarea clasei în acest fel este utilă nu numai pentru psihicul dvs., dar și pentru utilizarea unei astfel de caracteristici la îndemână ca autoloading.
Încărcarea automată funcționează astfel. Undeva la începutul unei aplicații PHP, creați o funcție specială __autoload (). Mai târziu, dacă undeva în cod există o încercare de a crea un obiect de clasă despre care nimic nu este cunoscut, PHP va apela automat această funcție, trecând-o ca parametru la numele clasei cerute. Toate funcțiile acestei funcții sunt de a găsi fișierul dorit și de ao încărca în script, descărcând astfel clasa însăși. După aceasta, PHP va putea crea un obiect din această clasă.
Să dăm un exemplu. Să scriem funcția __autoload () pentru a încărca automat clasele din folderul clasei:
Iată cum funcționează. Mai întâi, creați funcția __autoload () cu parametrul de intrare $ className. La început, funcția elimină toate substringurile ".." din parametrul primit, acest lucru se face din motive de securitate. Apoi, folosind funcția requ_once (), se încarcă fișierul necesar. Funcțiile sunt cunoscute a fi în folderul clase, iar extensia sa este .php. De asemenea, funcția afișează un mesaj pe pagină, așa că vom vedea imediat că a funcționat.
Atunci vom testa funcția noastră prin crearea unui obiect al clasei membre. Din moment ce nu am încărcat anterior fișierul cu această clasă, PHP va rula funcția __autoload (), trecând numele clasei la "Membru". Acesta, la rândul său, va căuta fișierul classes / Member.php. Apoi PHP creează obiectul Membru. În final, afișăm un mesaj care precizează că obiectul a fost creat.
Pentru a testa funcționarea acestui script, creați un folder de clase în același director ca scriptul. Creați în el un fișier Member.php cu o clasă simplă:
Acum, când am pornit scriptul, se va încărca fișierul classes / Member.php, va fi creat obiectul Membru și vor fi afișate următoarele:
Încărcarea automată vă poate economisi mult timp, mai ales dacă aveți un număr mare de clase. În loc de asteptare require_once funcția () la începutul fiecărui fișier pe care tocmai l-ați creat la începutul tuturor __autoload funcția aplicații (), și să dea cursuri de management încărcate în mâinile PHP!
Serializând obiecte
Următoarea caracteristică OOP pe care o voi acoperi este convertirea unui obiect într-un șir și invers, un șir într-un obiect. Acest lucru poate fi util în cazurile în care trebuie să transferați obiecte între scripturi și chiar aplicații. Iată câteva cazuri specifice:
Pentru a converti un obiect la un șir și invers, sunt utilizate următoarele funcții:
- serialize () - ia un obiect și returnează o reprezentare de șir a clasei și proprietăților sale;
- unserialize () - ia un șir creat cu serialize () și returnează un obiect.
Să ne uităm la aceste două funcții în acest caz:
Am creat o clasă simplă de membri, cu un câmp public $ username, un câmp privat de $ loggedIn și trei metode publice: login (), logout () și isLoggedIn (). Apoi, scriptul nostru creează un obiect al clasei membre, îi dă numele "Fred" și îl înregistrează.
Apoi numim funcția serialize (), oferindu-i un membru al clasei membre. serialize () returnează o reprezentare string a acestui obiect, pe care o stocăm în variabila $ memberString și afișăm-o pe pagină:
Apoi convertim șirul nostru înapoi la obiectul Membru prin apelarea funcției unserialize () și salvarea obiectului rezultat în variabila $ member2. Pentru a verifica dacă obiectul nostru a fost transformat corect și complet, afișăm valoarea câmpului său de utilizator $ și sunați la metoda isLoggedIn () pentru a verifica dacă utilizatorul sa logat. Iată ce se afișează pe pagină:
După cum puteți vedea, șirul creat de funcția serialize () conține numele clasei, precum și numele tuturor câmpurilor și valorile acestora pentru un anumit obiect. (Înainte de câmpurile private, numele clasei este scris, fără spații.) Cu toate acestea, numele metodei de clasă nu sunt scrise în șir.
Pentru ca funcția unserialize () să funcționeze, clasa obiectului care urmează a fi convertit din șir trebuie să fie încărcată înainte de apelarea apelului unserialize (). Puteți scrie clasa însăși în același script în care se numește unserialize () sau încărcați fișierul cu această clasă prin funcția requ_once (). De asemenea, puteți crea funcția __autoload (), pe care am menționat-o mai devreme. PHP va apela __autoload () dacă nu poate găsi clasa a cărei obiect pe care încerci să-l convertești.
Notă: funcțiile serialize () și unserialize () funcționează și cu alte tipuri de date, cum ar fi matricea. Cu toate acestea, ele nu funcționează cu resurse.
Funcțiile __sleep () și __wakeup ()
Uneori, înainte de serializarea unui obiect, este nevoie să curățați ceva. De exemplu, poate fi necesar să scrieți un obiect în baza de date și să închideți conexiunea. În mod similar, după deserializare, veți dori să restaurați conexiunea și să faceți mai multe acțiuni.
În PHP există mai multe metode speciale care vă vor ajuta în acest sens:
- __sleep () este numit strict înainte ca obiectul să fie serializat cu funcția serialize ().
- __wakeup () se numește imediat după ce obiectul este deserializat cu unserialize ().
Funcția __sleep () va trebui să returneze o listă de câmpuri de clasă. Acestea sunt câmpurile pe care seria () va include în șirul returnat. Puteți utiliza acest lucru pentru a exclude câmpurile inutile din reprezentarea șirului obiectului.
Să adăugăm metodele __sleep () și __wakeup () în exemplul nostru precedent:
Iată ce se afișează pe pagină:
Rețineți că:
- Metodele noastre __sleep () și __wakeup () nu curăță nimic și nu întreabă; în schimb, acestea afișează pur și simplu mesajele "Curățarea obiectului" și "Setarea obiectului".
- Deoarece includem câmpul $ username numai într-un matrice care returnează __sleep (), câmpul $ loggedIn nu va fi prezent în șirul de rezultate.
- Ca rezultat, câmpul $ loggedIn al obiectului deserializat va fi implicit false, astfel încât atunci când metoda isLoggedIn () este apelată de la obiectul deserializat, returnă false. De aceea, scriptul va afișa mesajul "Fred este deconectat".
Dacă doriți să scrieți metoda __sleep () și toate câmpurile sunt serializate, atunci trebuie să enumerați toate câmpurile pentru matrice pe care returnă metoda __sleep (). Acest lucru este ușor de realizat prin funcțiile PHP array_keys () și get_object_vars () în acest fel:
Notă: Un alt mod interesant de a serializa obiecte (și cross-platform) este de a converti șiruri de caractere JSON.
Obținerea de informații despre clase și obiecte
În PHP, există multe funcții utile pentru a obține informații despre clase și obiecte. Acest lucru este util în cazurile în care trebuie să lucrați cu obiecte dintr-o altă aplicație și, de asemenea, să vă ajutați să scrieți un cod convenabil și flexibil. Folosind aceste funcții pentru obiect, puteți obține numele clasei sale, verificați dacă este creată dintr-o anumită clasă, obțineți câmpurile și metodele sale etc.
Iată o scurtă listă a celor mai frecvent utilizate dintre ele:
Returnează matricea asociativă a tuturor câmpurilor obiectului $ obj, împreună cu valorile lor curente
Foarte important, cum ar fi funcții get_class_methods (), get_class_vars () și get_object_vars (), returnează numai acele metode și domenii care sunt în același domeniu de aplicare cu codul apelantului. De exemplu, metoda privată va fi inclusă în valoarea returnată a funcției get_class_methods () numai dacă get_class_methods () este apelată în cadrul metodei de clasă.
Să experimentăm unele dintre aceste funcții pe acest exemplu:
Scriptul creează o clasă de membri cu mai multe câmpuri și metode. De asemenea, creează clasa Administrator, un copil din clasa Membru. În clasa Administrator, se adaugă câmpul $ adminLevel public, precum și o pereche de metode: createForum () și banMember (), care vor fi doar pentru obiectele din clasa Administrator.
După crearea clasei, vom crea un obiect al clasei Administrator, îl vom salva în variabila $ admin, vom da numele "Mary" și vom autentifica administratorul folosind metoda login ().
În ultima parte a scriptului (linii 44-54), aplicăm diferite funcții obiectelor și clasei noastre. Iată rezultatul acestui cod:
Iată cum funcționează aceste funcții:
- get_class ($ admin) returnează valoarea șirului "Administrator".
- get_parent_class ($ admin) returnează valoarea șirului "Membru".
- is_a ($ admin, "Member") returnează true.
- get_class_methods ($ admin) returnează o serie de nume de metode pentru clasele Administrator și Membru. Deoarece toate aceste metode sunt publice, toate vor fi scrise într-o matrice.
- get_class_vars ($ admin) returnează o serie de nume de câmp public și valorile lor implicite corespunzătoare pentru clasele Administrator și Membru.
- get_object_vars ($ admin) returnează o serie de nume de câmpuri publice și valorile lor curente corespunzătoare.
- În cele din urmă, numim metoda member-listMyProperties (). Această metodă apelează funcția get_object_vars () și afișează rezultatul. Cu toate acestea, din moment ce get_object_vars () este apelat acum din cadrul clasei, acesta returnează și câmpul privat - $ loggedIn.
După cum puteți vedea, în PHP este foarte ușor să extrageți orice informație despre un obiect sau o clasă. În PHP există o funcție pentru obținerea de informații despre clasele de obiecte și interfețe, de exemplu, class_exists (), get_called_class (), get_declared_classes (), get_declared_interfaces (), interface_exists (), is_subclass_of (), method_exists () și property_exists ().
În această lecție, ați citit despre trei proprietăți utile ale obiectelor PHP:
- Folosind funcția __autoload () pentru a încărca automat fișierele cu clasele necesare;
- Cum se convertesc obiectele la siruri de caractere si invers folosind functiile PHP serialize () si unserialize ();
- Obținerea de informații despre obiecte, clase, strămoși folosind funcții PHP.
Cu aceste trei proprietăți, lucrul cu clasele și obiectele din PHP nu este o sarcină uriașă.
Sper că v-ați bucurat de această serie de lecții despre OOP în PHP! Dacă ați terminat toate cele 4 lecții, aveți suficiente cunoștințe pentru a scrie mari site-uri și aplicații PHP. Totuși, povestea nu se termină acolo - în PHP există încă multe proprietăți utile destinate să lucreze cu OOP, de exemplu:
Dacă am timp și dacă aveți o astfel de nevoie, voi vorbi cu siguranță despre ele în următoarele lecții.
Prin obținerea de informații imediat prin două canale (vedere și auz), eficiența predării este mult mai mare decât învățarea din cărți. Și temele și testele online vă vor permite să gândiți în mod constant în limba pe care o învățați și să vă verificați imediat cunoștințele!
Dacă doriți să învățați HTML mult timp, atunci am o veste bună pentru dvs.!
Dacă ați învățat deja HTML și doriți să treceți mai departe, următorul pas este să învățați tehnologia CSS.
Dacă doriți să înțeleagă conceptele de domeniu si hosting, învață cum să creeze o bază de date, încărca fișiere pe un site web prin intermediul unui server FTP, crea subdomenii, configurați cutiile poștale pentru site-ul și să monitorizeze participarea, acest curs este conceput special pentru tine!