PHP este mult mai mult decât un limbaj de scripting. Este un limbaj plin de capacitate de a construi aplicații foarte complexe. Utilizând puterea completă de programare orientată pe obiecte, puteți reduce timpul petrecut în codificare și îl puteți folosi pentru a construi site-uri mai bune. Acest tutorial vă va arăta cum.
OOP înseamnă Object Oriented Programming. OOP este o paradigmă de programare în care creați "obiecte" cu care să lucrați. Aceste obiecte pot fi apoi adaptate nevoilor dvs. specifice, pentru a servi diferite tipuri de aplicații, păstrând în același timp aceeași bază de cod. Foarte util într-adevăr.
Un obiect este pur și simplu o copie sau o instanță a unei "clase". O clasă poate fi definită ca o "cutie neagră" de unde creăm obiectele și accesăm atributele (variabilele) și metodele (funcțiile). Cea mai obișnuită analogie dată când explicați clasele și OOP este modul în care conduceți o mașină: în principiu, aveți 2 sau 3 pedale, un stick de viteză și un volan. Nu aveți nevoie (și, probabil, nu doriți) să știți cum funcționează mașina atunci când apăsați pedalele. Vrei doar ca mașina ta să meargă înainte și înapoi, la stânga și la dreapta. Și OOP este tocmai asta. Nu trebuie să știți cum funcționează metodele unei clase (dacă nu ați implementat-o singură), exact ce fac ei. OOP este, de asemenea, util dacă aveți un număr mare de obiecte de același tip într-un sistem: trebuie doar să creați obiectele și apoi să le manipulați toate în același mod, fără a rescrie orice cod. Mai mult decât atât, un obiect este capabil să-și mențină starea (valori variabile și altele asemenea) pe parcursul executării programului.
PHP 5 (deși majoritatea ideilor din acest articol se aplică și în cazul PHP 4), are un suport deosebit pentru programarea orientată pe obiecte, oferind crearea ușoară a clasei. PHP oferă fiecărei paradigme alte implementări de limbaj OOP "adevărat" (Python și JAVA, de exemplu), cum ar fi moștenirea, polimorfismul și încapsularea.
Ideea de bază din spatele moștenirii este aceea că obiectele similare au proprietăți comune. Deci, prin crearea unei clase "generice", putem avea un plan pentru a construi clasele noastre ulterioare. Imaginați-vă dacă doriți, proprietățile unei mașini: culoarea, numărul de roți, puterea, numărul de locuri etc. Prin acest model putem specializa mașinile noastre prin extinderea acestei clase: crearea unei mașini de curse cu proprietatea "nitro" sau un camion care are o proprietate "remorcă". Linia de jos este: creați o clasă mai generică care conține majoritatea atributelor comune și veți avea mult mai puține lucruri care definesc alte obiecte doar puțin diferite. În loc să rescrieți întregul cod, vă extindeți proprietățile, economisind o mulțime de timp în acest proces.
Așa cum am explicat anterior, unul dintre principalele avantaje ale utilizării obiectelor este că nu avem nevoie să dezvăluim toți membrii (atribute sau funcții); doar interfețele necesare pentru a lucra cu ea. Detaliile care nu sunt utile pentru utilizarea acestor obiecte ar trebui să fie ascunse de restul obiectelor. Aceasta este denumită încapsulare.
NOTĂ: În mod implicit, în PHP, un membru al clasei este public dacă nu este declarat privat sau protejat. Consultați un exemplu aici.
Polimorfismul este o caracteristică OOP care permite programatorului să atribuie un sens sau o utilizare diferită la ceva în contexte diferite - în special, pentru a permite unui membru al clasei să îndeplinească diferite sarcini în funcție de contextul în care a fost folosit. Imaginați-vă că aveți o clasă Persoană și două sub-clase de Persoană: japoneză și americană. Ambele implementează o funcție denumită talk (), dar cu diferite limbi și context social. Și în timp ce ambii sunt, în principiu, Oamenii (așa cum derivă din clasa Persoană), implementarea lor a discursului funcțional () este foarte diferită. Deci, în principiu, aveți două obiecte din clasa Persoană în care funcția talk () funcționează diferit.
Ok, acum pentru acțiunea reală. Vom crea o clasă simplă pentru a manipula manipularea imaginilor și extragerea informațiilor. Pe durata acestui tutorial voi presupune că aveți o înțelegere de bază despre PHP (variabile, crearea de funcții, lucrul cu declarații de flux de control și bucle). Citirea manualului GD PHP va elimina orice dubii pe care le aveți despre funcțiile de manipulare a imaginilor.
Începem prin definirea clasei noastre:
Acest lucru spune doar PHP vom începe să definească o nouă clasă, numit "Imagine". Acum vom defini constructorul de clasă. Un constructor este pur și simplu funcția care se numește atunci când se creează un obiect nou. În PHP 5 acest lucru se poate realiza prin două metode diferite: crearea unei funcții publice cu exact același nume al clasei (PHP 4 și on) sau crearea unei funcții numită "__construct ()" (numai PHP 5):
Următoarele două bucăți de cod fac exact același lucru:
NOTĂ: Un constructor de clasă este întotdeauna public.
Constructorii de clasă ar trebui utilizați pentru a se asigura că obiectul creat are o cantitate minimă de date la care să lucrați; în cazul nostru, imaginea dorită.
Ca atare, primul lucru pe care trebuie să-l facem este să citim imaginea, oricare ar fi tipul. În prezent, biblioteca GD acceptă un număr de tipuri de imagini, cum ar fi jpg, png, gif, bmp și altele; trebuie doar să citim imaginea și să determinăm tipul.
Deci, ce am făcut? Pentru a deschide imaginea cât mai ușor posibil, vom folosi funcția GD's imagecreatefromstring (care ia un șir de date binare ca intrare), în loc de imagecreatefromjpeg, imagecreatefrompng sau imagecreatefromgif, de exemplu.
Așadar, încercăm să deschidem un fișier de imagine și să îi atribuim indicatorul de fișier $ fp
, și, în caz de eșec, termină executarea programului.
$ fp = fopen (nume fișier $, 'rb') sau mor ("Image '$ filename" nu a fost găsit! ");
Apoi, vom crea un șir gol pentru a ține datele noastre ...
$ buf = ";
... și citiți întregul fișier, concatenând datele citite cu conținutul nou creat de șir.
în timp ce (! feof ($ fp)) $ buf. = fgets ($ fp, 4096);
Acum trebuie să ne creăm imaginea folosind datele pe care tocmai le citim ...
imagecreatefromstring ($ buf);
... și a crea un obiect pentru a utiliza toate aceste funcții.
$ image = imagine nouă ("image.png");
NOTĂ: jpg, png, gif și majoritatea fișierelor de imagine trebuie citite în modul binar, de unde "rb" a trecut ca al doilea argument al funcției fopen. "r" înseamnă doar pentru citire și "b" înseamnă binar.
În forma actuală, clasa noastră nu este foarte utilă. Așa că vom adăuga câteva atribute și metode pentru ao face mai utilă. Deci, vom începe cu 1: definirea unor variabile interne (notați declarația de vizibilitate "privată" înainte de fiecare variabilă)
image = imagecreatefromstring ($ buf); // extrage informații despre imagine $ info = getimagesize ($ filename); $ this-> width = $ info [0]; $ this-> height = $ info [1]; $ this-> mimetype = $ info ['mime']; $ image = imagine nouă ("image.png"); Dacă totul a mers bine, am citit acum imaginea?
Și 2: o metodă de afișare a imaginii.
($ this-> image); comutare ($ this-> image); pauză ($ this-> image); "$ image = new image ($ _GET ['image']); // Daca totul a mers bine, am citit acum imaginea?>
În acest pas am creat doar câteva atribute de clasă (imagine, lățime, înălțime și mimetype) pentru a ține datele obiectului. Apoi am făcut unele modificări pentru a atribui imaginea creată atributului nostru de clasă $ image
...
$ this-> image = imagecreatefromstring ($ buf)
... și a extras informațiile despre imagine la variabilele de clasă rămase (citiți documentația privind getimagesize pentru a înțelege pe deplin modul în care se citesc informațiile despre imagine):
// extrage informații despre imagine $ info = getimagesize ($ filename); $ this-> width = $ info [0]; $ this-> height = $ info [1]; $ this-> mimetype = $ info ['mime'];
În continuare, am creat o funcție care scoate imaginea în browser prin definirea anteturilor corespunzătoare (citiți mai multe pe anteturile http aici) și utilizând funcția corespunzătoare (cu instrucțiunea switch) pentru a scoate imaginea pe baza imaginii originale mimetype (pentru acest tutorial vom sprijini doar jpg, png și gif, dar, așa cum am spus anterior, GD suportă o multitudine de alte formate. Citește documentația php pentru mai multe).
Deci, ce sunt chestiile astea acolo? "$ this", în PHP, se referă la clasa însăși și este folosit pentru a indica atribute sau funcții ale clasei. Ca atare, $ this-> image indică atributul de clasă numit "$ image" și $ this-> image = ... modifică valoarea atributului class. Dacă ați scrie $ image = ... creați o nouă variabilă locală numită "$ image", disponibilă exclusiv pe durata funcției. Acesta este unul dintre principalele lucruri pe care trebuie să le acordați atenție când creați clase în PHP.
În prezent, clasa noastră nu este foarte utilă. Sigur, ne putem citi imaginea și o putem afișa, dar asta e tot. Vom crea acum o sub-clasă pentru a crea miniaturile noastre. (Nu avem nevoie să creați o subclase, dar din motive de tutorial, vom demonstra moștenirea și polimorfismul). Deci, pentru ca moștenirea să funcționeze corect, trebuie să schimbăm puțin definiția super-clasei noastre (Image). Trebuie doar să schimbăm vizibilitatea variabilelor clasei noastre de la "privat" la "protejat". Și acum vom crea constructorul din subclasa noastră.
imagine, 0, 0, 0, 0, $ lățime, $ înălțime, $ this-> width, $ this-> height); $ this-> image = $ thumb; ?>
Și ce anume facem aici? Am creat o nouă clasă, derivată din originalul nostru, ceea ce înseamnă că putem accesa toate atributele și metodele sale publice și protejate. Noi numim constructorul de super-clasă, responsabil pentru citirea imaginii și extragerea informațiilor. Constructorul de subclasă nu numește constructorul superclasei, așa că trebuie să îl numim în mod explicit.
Acum creăm o imagine nouă pentru miniatură, cu lățimea și înălțimea:
$ thumb = imaginecreatetruecolor ($ lățime, $ înălțime);
Resample (redimensionați) imaginea originală în cea nouă, pentru a crea miniatură:
imagecopyresampled ($ thumb, $ this-> imagine, 0, 0, 0, 0, $ lățime, $ înălțime, $ this-> width, $ this-> height);
Și în final modificați imaginea originală pentru a conține miniatură în locul imaginii de dimensiune completă:
$ this-> image = $ thumb;
Si ghici ce? Nu trebuie să scriem o funcție nouă pentru afișarea miniaturii, deoarece se aplică același principiu, indiferent dacă afișați o imagine de dimensiune completă sau o miniatură. La urma urmei, este încă o imagine! Așa că trebuie doar să sunăm funcția noastră de afișare (), definită în super-clasă, și am terminat!
Și asta încheie tutorialul nostru. Ca un exercițiu I, vă sugerăm să implementați o funcție pentru a salva miniaturile generate pe disc în loc să le executați în zbor (Unde ar trebui să implementați această funcție? În super sau subclass?). Mult noroc și verificați zipul prevăzut pentru un exemplu de utilizare și clasele complete dezvoltate aici (trebuie să aveți un server powered by PHP pentru a testa acest lucru).