Lære OOP i PHP ASAP!

PHP er så mye mer enn et skriptspråk. Det er et fullverdig språk som er i stand til å bygge svært komplekse applikasjoner. Ved å utnytte den fullstendige effekten av Objektorientert Programmering, kan du redusere tiden du bruker koding og bruke den til å bygge bedre nettsteder. Denne opplæringen vil vise deg hvordan.




Hva er OOP?

OOP står for Object Oriented Programming. OOP er et programmeringsparadigm der du lager "objekter" til å jobbe med. Disse objektene kan da skreddersys for dine spesifikke behov, for å betjene forskjellige typer applikasjoner samtidig som du opprettholder samme kodebase. Ganske nyttig faktisk.

Hva er et objekt?

Et objekt er bare en kopi eller forekomst av en "klasse". En klasse kan defineres som en "svart boks" hvorfra vi lager våre objekter og får tilgang til dets attributter (variabler) og metoder (funksjoner). Den vanligste analogien som er gitt når du forklarer klasser og OOP, er hvordan du kjører bil: i utgangspunktet har du 2 eller 3 pedaler, en girkasse og et ratt. Du trenger ikke (og sannsynligvis ikke vil) for å vite hvordan bilen fungerer når du trykker på pedaler. Du vil bare at bilen skal gå frem og tilbake, til venstre og høyre. Og OOP er nettopp det. Du trenger ikke å vite hvordan metodene for en klasse jobber (hvis du ikke implementerte det selv), bare hva de gjør. OOP er også nyttig hvis du har et stort antall objekter av samme type i et system: du må bare lage objekter og manipulere dem alle på samme måte uten å skrive om noen kode. Videre er et objekt i stand til å opprettholde dets tilstand (variable verdier og lignende) gjennom hele programmets gjennomføring.


Implementeringen av "Bil" er skjult fra oss, men vi kan bruke sin fulle kapasitet.

OOP i PHP

PHP 5 (selv om de fleste av ideene i denne artikkelen også gjelder for PHP 4) har god støtte for objektorientert programmering ved å gi enkel klasseskapning. PHP gir hvert paradigme andre "sanne" OOP-språk implementere (Python og JAVA, for eksempel), som arv, polymorfisme og innkapsling.

Arv

Den grunnleggende ideen bak arv er at lignende objekter deler felles egenskaper. Så ved å lage en "generisk" klasse, kan vi få en tegning for å bygge våre påfølgende klasser på. Tenk deg, om du vil, bilens egenskaper: farge, antall hjul, hestekrefter, antall seter, etc. Med denne malen kan vi videre spesialisere våre biler ved å utvide denne klassen: Opprette en racerbil med en "nitro" -egenskap, eller en lastebil som har en "trailer" eiendom. Bunnlinjen er: Lag en mer generisk klasse som inneholder de fleste av de vanlige attributter, og du vil ha mye mindre arbeid som bare definerer andre objekter litt annerledes. I stedet for å omskrive hele koden, utvider du bare dens egenskaper, og sparer mye tid i prosessen.


Arv diagram for våre bilklasser.

innkapsling

Som tidligere forklart, er en av hovedfordelene ved å bruke objekter at vi ikke trenger å avsløre alle dets medlemmer (attributter eller funksjoner); bare de nødvendige grensesnittene for å jobbe med det. Detaljer som ikke er nyttige for bruk av disse objektene, skal være skjult fra resten av objektene. Dette er det som kalles innkapsling.

Siktnivåer

  • offentlig: betyr at et klassemedlem er synlig og brukbar / modifiserbar av alle
  • privat: betyr at et klassemedlem kun er brukbart / modifiserbart av klassen selv
  • beskyttet: betyr at et klassemedlem kun er brukbart / modifiserbart av klassen selv og eventuelle underklasser

MERK: Som standard, i PHP, er et klassemedlem offentlig, med mindre de er privat eller beskyttet. Sjekk ut et eksempel her.

polymorfisme

Polymorfisme er en OOP-karakteristikk som gjør at programmereren kan tilordne en annen mening eller bruk til noe i forskjellige sammenhenger - spesielt for å tillate et klassemedlem å utføre ulike oppgaver, avhengig av konteksten det ble brukt. Tenk deg at du har en personklasse og to underklasser av person: japansk og amerikansk. Begge implementere en funksjon som heter talk (), men med forskjellige språk og sosiale kontekst. Og mens begge er i utgangspunktet Mennesker (som de kommer fra klassen Person), er implementeringen av funksjonsdiskusjonen () veldig forskjellig. Så du har i utgangspunktet to objekter av klassen Personen der talk () -funksjonen fungerer annerledes.

Får hendene våre skitne

Ok, nå for den virkelige handlingen. Vi skal skape en enkel klasse for å håndtere bildemanipulering og informasjonsutvinning. I løpet av denne opplæringen vil jeg anta at du har en grunnleggende forståelse av PHP (variabler, skaper funksjoner, arbeider med kontrollflowoppstillinger og sløyfer). Å lese GD PHP-håndboken fjerner eventuelle tvil om bildebehandlingsfunksjoner.

Trinn 1: Opprette vår klasse

Vi starter med å definere vår klasse:

Dette forteller bare PHP, vi skal begynne å definere en ny klasse, kalt "Image". Nå skal vi definere klassekonstruktøren. En konstruktør er bare den funksjonen som kalles når du oppretter en ny gjenstand. I PHP 5 kan dette oppnås ved to forskjellige metoder: Opprett en offentlig funksjon med nøyaktig samme navn på klassen (PHP 4 og på) eller ved å opprette en funksjon kalt "__construct ()" (kun PHP 5):

Trinn 2: Opprette klassekonstruktøren

Følgende to stykker kode gjør akkurat det samme:

MERK: En klassekonstruktør er alltid offentlig.

Klassekonstruksjoner bør brukes til å sikre at det opprettede objektet har en minimal mengde data for å jobbe med; i vårt tilfelle det ønskede bildet.

Som sådan er det første vi må gjøre, å lese bildet, uansett hva det er, kan det være. For øyeblikket støtter GD-biblioteket en rekke bildetyper, for eksempel jpg, png, gif, bmp og andre; vi må bare lese bildet og bestemme det er type.

Så hva har vi gjort? For å åpne bildet så enkelt som mulig, bruker vi GDs funksjon imagecreatefromstring (som tar en binær streng av data som input), i stedet for imagecreatefromjpeg, imagecreatefrompng eller imagecreatefromgif, for eksempel.

Så vi prøver å åpne en bildefil og tildele den filpekeren til $ fp, og, i tilfelle feil, avslutte programmets utførelse.

$ fp = fopen ($ filnavn, 'rb') eller dø ("Bilde '$ filnavn' ikke funnet!");

Deretter lager vi en tom streng for å holde dataene våre ...

$ buf = ";

... og les hele filen, sammenkoble dataene lest med våre nyopprettede strenginnhold.

mens (! feof ($ fp)) $ buf. = fgets ($ fp, 4096);

Nå må vi bare lage vårt bilde ved hjelp av dataene vi nettopp har lest ...

imagecreatefromstring ($ buf);

... og lag et objekt for å bruke alle disse funksjonene.

$ image = nytt bilde ("image.png");

MERK: jpg, png, gif og de fleste bildefiler må leses i binær modus, derfor "rb" bestått som det andre argumentet for fopen-funksjonen. "r" betyr skrivebeskyttet og "b" betyr binær.

Trinn 3: Definere klassegenskaper og metoder

I sin nåværende form er ikke klassen vår veldig nyttig. Så vi vil legge til noen attributter og metoder for å gjøre det mer nyttig. Så vi begynner med 1: definere noen interne variabler (merk "den" siktighetsdeklarasjonen før hver variabel)

image = imagecreatefromstring ($ buf); // ekstra bildeinformasjon $ info = getimagesize ($ filnavn); $ this-> width = $ info [0]; $ this-> height = $ info [1]; $ this-> mimetype = $ info ['mime'];  $ image = nytt bilde ("image.png"); // Hvis alt gikk bra har vi nå lest bildet?>

Og 2. metode for å vise bildet.

mimetype "); bytt ($ this-> mimetype) case 'image / jpeg': imagejpeg ($ this-> bilde); break; case 'image / png': imagepng ($ dette-> bildet); tilfelle 'image / gif': imagegif ($ this-> bilde); break; // exit; $ image = nytt bilde ($ _ GET ['image']); // Hvis alt gikk bra har vi nå lest bildet?>

I dette trinnet har vi nettopp opprettet noen klassegenskaper (bilde, bredde, høyde og mimetype) for å holde objektets data. Deretter gjorde vi noen endringer for å tildele det opprettede bildet til klassen attributtet $ bilde...

$ this-> image = imagecreatefrom ($ buf)

... og hentet bildens informasjon til våre gjenværende klassevariabler (les dokumentasjonen på getimagesize for å forstå hvordan bildedataene leses):

// ekstra bildeinformasjon $ info = getimagesize ($ filnavn); $ this-> width = $ info [0]; $ this-> height = $ info [1]; $ this-> mimetype = $ info ['mime'];

Deretter opprettet vi en funksjon som utfører bildet til nettleseren ved å definere de aktuelle overskriftene (les mer på http-overskrifter her) og bruke den aktuelle funksjonen (med bryteretningen) for å utdatere bildet basert på den opprinnelige bildemimetypen (for denne opplæringen vi vil bare støtte jpg, png og gif, men som jeg sa før, støtter GD et mangfold av andre formater. Les php dokumentasjonen for mer).

Så hva er dette "$ dette" greiene der inne? "$ this", i PHP, refererer til selve klassen, og det pleier å peke på klassen attributter eller funksjoner. Som sådan, $ this-> bilde poeng til klassen attributt kalt "$ image" og $ this-> image = ... endrer verdien av klassen attributtet. Hvis du skulle skrive $ image = ... ville du bare opprette en ny lokal variabel kalt "$ image", som er tilgjengelig utelukkende i løpet av funksjonens varighet. Dette er en av de viktigste tingene å være oppmerksom på når du lager klasser i PHP.


Vår ikke veldig nyttig (ennå!) Skjermmetode.

Trinn 4: Definere vår "Miniatyr" underklasse

For øyeblikket er ikke klassen vår veldig nyttig. Jo, vi kan lese bildet vårt og vise det, men det er det. Vi vil nå lage en underklasse for å lage miniatyrer. (Vi trenger egentlig ikke å lage en underklasse, men vi vil for å få veiledningen, vise arv og polymorfisme). Så, for arven til å fungere riktig må vi litt endre definisjonen av vår superklasse (Bilde). Vi trenger bare å endre synligheten av våre klassevariabler fra "privat" til "beskyttet". Og nå skal vi lage konstruktøren til vår underklasse.

bilde, 0, 0, 0, 0, $ bredde, $ høyde, $ denne-> bredde, $ denne-> høyde); $ this-> image = $ thumb; ?>

Så hva gjør vi her akkurat nå? Vi opprettet en ny klasse, avledet fra vår opprinnelige, noe som betyr at vi kan få tilgang til alle sine offentlige og beskyttede attributter og metoder. Vi kaller den førsteklasses konstruktøren, ansvarlig for å lese bildet og utvinne sin informasjon. Underklassekonstruktøren kaller ikke sin superklasse-konstruktør, så vi må ringe det eksplisitt.

Nå lager vi et nytt bilde for vår miniatyrbilde, med bredde og høyde som er gått:

$ thumb = imagecreatetruecolor ($ bredde, $ høyde);

Resample (endre størrelse) det opprinnelige bildet til det nye, for å lage miniatyrbildet:

imagecopyresampled ($ thumb, $ this-> bilde, 0, 0, 0, 0, $ bredde, $ høyde, $ denne-> bredde, $ denne-> høyde);

Og endelig modifiser det opprinnelige bildet for å inneholde miniatyrbildet i stedet for bildet i full størrelse:

$ this-> image = $ thumb;

Og gjett hva? Vi trenger ikke egentlig å skrive en ny funksjon for å vise miniatyrbildet fordi det samme prinsippet gjelder, om du viser et fullstørrelsesbilde eller et miniatyrbilde. Tross alt er det fortsatt et bilde! Så vi trenger bare å ringe vår display () -funksjon, definert i superklassen, og vi er ferdige!


Vår fullførte klasse og respektive underklasse.

Og det avsluttes vår veiledning. Som en øvelse foreslår jeg at du implementerer en funksjon for å lagre de genererte miniatyrbildene på disk i stedet for å sende den ut på fly (Hvor skal du implementere den funksjonen? I super- eller underklassen?). Lykke til og sjekk zip oppgitt for eksempel bruk og de fullstendige klassene utviklet her (du må ha en PHP-drevet server for å teste den).

  • Abonner på NETTUTS RSS-feed for flere daglige webutviklinger og artikler.