I den forrige artikkelen introduserte vi begrepet objektorientert arv, forsøkte å legge det til lekmannens vilkår, og tok også et høyt nivå på den konseptuelle modellen av hvordan det fungerer innenfor rammen av programmering.
Men før vi går videre og / eller hvis du bare går med i serien, vennligst se gjennom alt vi har dekket så langt ved å lese de forrige artiklene:
Ja - vi har dekket mye, men for å legge grunnlaget for en nybegynner å ha et sterkt sted for å begynne å skrive objektorientert PHP, er det mye å undersøke.
Med det sagt er arv hvor vi begynner å komme inn i paradigmets mellomliggende temaer, så dette vil være den endelige artikkelen som tar en titt på nybegynnerbegrepene, hvoretter vi vil avslutte serien med et sammendragspost.
Husk at vi definerte arv som følgende:
Arv er når en klasse tjener som overordnet klasse for en barneklasse som gir en rekke attributter og metoder som er felles for både foreldre og barn; Imidlertid barnet som evnen til å introdusere sine egne attributter.
Det er litt mindre formelt enn det du finner i en akademisk bok, eller til og med på Wikipedia, men det forklarer fortsatt ideen i termer som illustrerer poenget.
I denne artikkelen vurderer vi all nødvendig kode, funksjoner og reserverte ord relatert til emnet. Vi skal se på hvordan vi kan implementere det innen PHP på en veldig, veldig enkel plattform-agnostisk måte , Og så vurderer vi en faktisk implementering av hvor arv er i spill innenfor WordPress.
Så med det som vår veikart for artikkelen, la oss gå videre og komme i gang.
For å implementere arv i objektorientert PHP, finnes det en rekke reserverte ord som vi trenger å gjøre oss kjent med. Heldigvis har de fleste ordene vi allerede har dekket, og de som vi ikke har, klart nok slik at det er lett å huske dem.
Så før vi dykker inn i å se på kode, la oss ta en titt på alle de reserverte ordene på språket som vi trenger å vite, slik at vi kan begynne å faktisk komme inn i å skape noe.
strekker
er reservert ord som indikerer at en klasse er barn i en annen klasse. For eksempel, i vår tidligere artikkel, a Post
strekker Innhold
. Vi ser snart dette i spill.privat
er et attributt som brukes på egenskaper og funksjoner som betyr at de er tilgjengelige bare innenfor rammen av den klassen de er definert i.beskyttet
den er lik privat
med unntak av at egenskapene og metodene som er merket som sådan, kan nås av den givne klassen og eventuelle barneklasser.offentlig
er motsatt av privat
det betyr at enhver klasse - den gitte klassen, en underklasse eller en tredjepartsklasse - kan få tilgang til eiendommen eller metoden for å endre den informasjonen eller ringe funksjonen.Du må også være kjent med ::
operatør, men vi vil dekke det litt senere i artikkelen når vi begynner å se på koden.
Og det er det - ingenting fryktelig skremmende, er det? Og hva som er enda bedre er at hvis du har fulgt med oss gjennom hele denne serien, så er du sannsynligvis kjent med hvert ord, lagre for strekker
.
Uansett, med det sagt, la oss begynne å jobbe med et eksempel.
For å komme i gang med å skrive noen eksempler, må vi legge ut nøyaktig hva det er som vi skal prøve å modellere (det er jo det som koden gjør, er det ikke?).
I tråd med temaet som brukes i denne serien - spesielt i den siste artikkelen - har vi en foreldersklasse som heter Innhold
, og to barnklasser som hver vil bli navngitt Kommentar
og Post
, henholdsvis.
Dette vil gjøre det mulig for oss å se hvordan egenskaper og metoder finnes i en enkelt klasse, og hvordan barn kan få tilgang til egenskapene til foreldrene deres, samt hvordan foreldre kan beskytte sine egenskaper og funksjoner fra barna sine også.
Men implementeringen vil demonstrere langt mer enn å snakke om det, så la oss begynne å skrive noen kode.
I vårt eksempel vil foreldreklassen være den Innhold
fordi begge delklassene - det vil si den Post
og Kommentar
- er typer innhold som har unik informasjon knyttet til dem som ikke er spesifikk for Innhold
klasse.
Nøkkelen til arv er å identifisere alle egenskapene og metodene som er felles i alle klassene, og holde dem definert i foreldreklassen eller i vår klasse i Innhold
.
Selv om dette kan variere basert på hvordan du ser dette, oppretter vi det Innhold
slik at den inkluderer:
Først skal vi se på koden, så vil vi forklare alt som skjer med det.
publish_date = $ date-> format ('Y-m-d H: i: s'); $ this-> author = "; offentlig funksjon lagre ($ forfatter, $ innhold) $ this-> forfatter = $ forfatter; $ this-> content = $ this-> format_content ($ content); $ this-> innhold ; offentlig funksjon les () return $ this-> innhold; privat funksjon format_content ($ innhold) return strip_tags (stripslashes ($ content)); offentlig funksjon get_author () return $ this-> author;
Som tidligere nevnt har vi to beskyttet
attributter og a privat
Egenskap. Husk at dette betyr at alle underklassene har tilgang til $ PUBLISH_DATE
og $ forfatter
, men bare de Innhold
kan få tilgang til $ innhold
Egenskap.
Legg også merke til at mye av koden du ser i den ovennevnte klassen, er grunnleggende objektorientert PHP. Det er ingenting som skiller seg ut som handler direkte med arv annet enn noen av tilgangsmodifiseringene som vi har erklært. Det vil si at det er relativt vanlig å kode som vi har sett så langt i denne opplæringen.
En av de tingene som er verdt å merke seg er at den private funksjonen er på plass for å demonstrere to ting:
privat
Funksjoner er bare tilgjengelige i sammenheng med klassen der den er definert.Selvfølgelig er denne koden ikke koblet til en database eller et filsystem eller noe, men poenget er fortsatt.
Merk at i koden ovenfor er det et par ting vi har behov for å legge til for å tilfredsstille PHPs krav. De er utenfor rammen av denne artikkelen, men det er verdt å peke ut her:
date_default_time_set
er nødvendig for å angi tidszonen av hvilken tiden kan hentes.Post
kan ha sin egen forfatter og Kommentar
kan også ha sin egen forfatter. Som vi ser senere, a Kommentar
kan til og med overstyre standard publiseringsdato.Vær også oppmerksom på at vi kan hente innholdet fra lese
metode og vi er i stand til å få forfatteren fra get_author
funksjon.
Deretter la oss gå videre og opprette Post
underklasse. Først tar vi en titt på koden og så ser vi hvordan det samhandler med Innhold
klasse vi nettopp opprettet.
forfatter = 'Tom McFarlin'; offentlig funksjon post ($ innhold) $ this-> format_content ($ innhold);
Klassen ser ut som liten, ikke sant? Det er ingen egenskaper - fordi det arver dem fra Innhold
klasse - og det er bare to funksjoner, hvorav en er unik for klassen - post
.
Legg merke til at vi i konstruktøren først ringer til foreldrekonstruenten ved hjelp av ::
operatør. Du kan lese mye mer om dette i håndboken, men det er nok å si at operatøren er reservert for å referere til en rekke forskjeller ting utenfor klassen der den er definert. I vårt tilfelle er det kallet til foreldrenes konstruktør.
Deretter har jeg valgt å angi navnet mitt som forfatter av innlegget. Legg merke til at jeg bruker $ dette
søkeord. Fordi underklassen arver egenskaper fra sin overordnede, kan den referere til disse egenskapene, og hvis de ble definert i seg selv.
Merk at dette er mulig, ikke bare fordi Innlegg utvider innhold
men fordi eiendommen er merket som beskyttet
i Innhold
, også. Hvis det ble merket som privat
, dette ville ikke være mulig.
Nå som vi har opprettet Post
klasse, vi har også Kommentar
klasse som, husker, representerer noen som forlater en kommentar på et innlegg. Var denne produksjonsnivån koden, det ville være langt mer kode: Vi ville måtte relatere en kommentar til et innlegg, avgjøre om en kommentar er et svar på en eksisterende kommentar, markere en status for en kommentar og så videre.
Men med det formål å demonstrere arv, Vi drar alt dette ut og fokuserer bare på de tingene som kan drive konseptene.
lagre ('John Doe', $ kommentar);
Som du kan se, er Kommentar
koden er ikke mye forskjellig fra Post
kode. I en grad - dette er bra fordi det viser at vi har oppsummert de riktige delene i vår grunnklasse.
Uansett, legg merke til at etter at vi har konstruert Kommentar
, Vi ringer til foreldrekonstruktøren. Deretter definerer vi Legg til
metode som er ansvarlig for å ta imot kommentaren og deretter lagre den ved å sende kommentarforfatteren og det er innhold til lagre
metode.
Den fine tingen er at lagre
Metoden er allerede definert i grunnklassen som også håndterer all formatering ved bruk av a privat
funksjon, slik at vi får den funksjonaliteten når vi lager vår barneklasse.
Med det gjort, la oss løse et par eksempler for å vise hvordan brikkene passer sammen. For å sikre at denne koden kjøres, er alt du trenger, en webserver, en katalog der du kan kjøre PHP-skript og en tekstredigerer.
Først skal vi opprette en forekomst av Innhold
og så kaller vi en feilsøkingsoppstilling slik at vi kan se hva som er en forekomst av klassen.
$ content = nytt innhold (); var_dump ($ innhold);
Tillat alle arbeider riktig, bør du se alt som er over.
Neste opp, la oss gå videre og opprette et innlegg. Siden vi setter all informasjon inn i klassens sammenheng, er alt vi virkelig trenger å gjøre, å ringe en funksjon på klassen for å vise informasjonen.
For eksempel:
$ post = nytt innlegg (); ekko 'Postforfatteren er:'. $ Post-> get_author ();
Igjen, siden vi har satt opp alt i selve koden, bare å kalle metoden demonstrerer konseptet.
Til slutt kan vi lage en Kommentar
, Ring Legg til
metode på en forekomst av klassen, forsøk å passere i ondsinnet kode (bare for å se det fjernet av vår kode). Hvis alt går bra, bør du se følgende:
$ comment = ny kommentar (); $ comment-> add (''); ekko 'Kommentaren lyder:'. $ Kommentar-> lese ();
Og det er det: Vår enkle demonstrasjon av arv.
Når det gjelder å se på arv i WordPress, er det aller første som kommer til å tenke for meg selv - og sannsynligvis andre utviklere - Widgets API. Grunnen til at jeg sier dette er fordi API-en er drevet av arv.
Sikker, widgets kan opprettes uten å bruke API, men jeg vil hevde at det er en feil i utviklingen. Hvorfor gjøre ting mer komplisert for deg selv når det allerede er grunnlag for å gjøre det? Men jeg går ned.
Den fine tingen om denne APIen er at den viser alle høydepunktene i objektorientert programmering og arv på jobben. For eksempel, her er et stykke prøvekode tatt direkte fra Codex:
Nå som vi har dekket konseptmodellen, sett på søkeordene og metodologien, skrevet vår egen kode og laget vårt eget eksempel, bør dette være relativt enkelt å følge.
Men her er saken: En av de beste måtene å bli bedre på å skrive noen form for kode er å kontinuerlig øve konseptene. Det vil si å utforske ideene skrevet av andre mennesker som har gjort mer avanserte ting som du i tidligere arbeid.
Saks i punkt, ta en titt på det første eksemplet som tilbys i WordPress Codex. Og hvis du jobber med en nyere versjon av PHP som støtter funksjoner som navneområder (et litt mer avansert emne), så sjekk ut det andre eksempelet også.
Jo mer du vurderer koden og driller den fra hverandre, desto mer skal du lære om det. Men gå lenger enn det i denne artikkelen vil ta oss ut av omfanget av hele serien.
Til slutten
På dette tidspunktet har vi dekket alle nybegynnere som er nødvendige for å legge grunnlaget for en nybegynners guide til å skrive objektorientert PHP. I den endelige artikkelen vil vi gi et sammendrag av alt vi har dekket slik at vi har en enkelt referanse for de store ideene som kan bokmerkes, lagres eller refereres til senere.
I tillegg har vi en kort diskusjon om en oppfølgingsserie, men vi lagrer det frem til da.
For øyeblikket, hvis du har spørsmål, kommentarer og / eller tilbakemelding på innholdet, koden eller eksemplene ovenfor, kan du gjerne gjøre det i kommentarfeltet nedenfor.