I den föregående artikeln introducerade vi begreppet objektorienterat arv, försökte placera det lekmänens termer och tog sedan också en hög nivå på den konceptuella modellen av hur det fungerar inom ramen för programmering.
Men innan vi går längre och / eller om du bara går med i serien, kan du läsa igenom allt vi har täckt hittills genom att läsa tidigare artiklar:
Ja - vi har täckt mycket, men för att lägga grunden för en nybörjare att ha en stark plats för att börja skriva objektorienterad PHP, är det mycket att undersöka.
Med det sagt är arvet där vi börjar komma in i paradigmets mellanliggande ämnen, så det här blir den sista artikeln som tar en titt på nybörjarkoncepten, varefter vi kommer att avsluta serien med en sammanfattande post.
Minns att vi definierade arv som följande:
Arv är när en klass tjänar som förälderklass för en barnklass som ger ett antal attribut och metoder som är gemensamma för både föräldern och barnet. dock barnet som förmågan att presentera sina egna attribut.
Det är lite mindre formellt än vad du kan hitta i en akademisk bok, eller till och med på Wikipedia, men det förklarar fortfarande idén i termer som illustrerar poängen.
I den här artikeln granskar vi all nödvändig kod, funktioner och reserverade ord relaterade till ämnet, vi ska titta på hur vi kan implementera det inom PHP på ett mycket, mycket enkelt plattforms agnostiskt sätt , Och sedan granskar vi ett faktiskt genomförande av var arvet är på spel inom WordPress.
Så med det som vår färdplan för artikeln, låt oss gå vidare och komma igång.
För att genomföra arv i objektorienterad PHP finns det ett antal reserverade ord som vi behöver bekanta oss med. Lyckligtvis har de flesta av de ord vi redan har täckt och de som vi inte har tillräckligt tydliga så att det är lätt att komma ihåg dem.
Så innan vi dyker in på att titta på kod, låt oss ta en titt på alla reserverade orden på språket som vi behöver veta så att vi kan börja faktiskt komma in på att skapa något.
sträcker
är reserverat ord som indikerar att en klass är barnet i en annan klass. Till exempel, i vår tidigare artikel, a Posta
sträcker Innehåll
. Vi ses snart snart.privat
är ett attribut som tillämpas på egenskaper och funktioner som betyder att de är tillgängliga endast inom ramen för den klass där de definieras.skyddad
liknar privat
med undantag för att de egenskaper och metoder som är markerade som sådana kan nås av den givna klassen och eventuella barnklasser.offentlig
är motsatsen till privat
därmed betyder det att någon klass - den givna klassen, en underklass eller en tredje partsklass - kan komma åt egenskapen eller metoden för att ändra den informationen eller ringa funktionen.Du måste också vara bekant med ::
operatör, men vi kommer att täcka det lite senare i artikeln när vi börjar titta på kod.
Och det är det - inget fruktansvärt skrämmande, är det? Och vad som är ännu bättre är att om du har följt med oss i hela serien, så är du troligt bekant med varje ord som sparas för sträcker
.
Hur som helst, med det sagt, låt oss börja arbeta med ett exempel.
För att komma igång med att skriva några exempelkod måste vi definiera exakt vad det är att vi ska försöka modellera (trots allt är det vad koden gör, eller hur?).
I överensstämmelse med det tema som används i denna serie - särskilt i den senaste artikeln - kommer vi att ha en föräldraklass som heter Innehåll
, och två barnklasser som var och en kommer att namnges Kommentar
och Posta
, respektive.
Detta gör det möjligt för oss att se hur egenskaper och metoder finns i en enda klass och hur barn kan få tillgång till attribut hos sina föräldrar, liksom hur föräldrar kan skydda sina egenskaper och funktioner från sina barn.
Men genomförandet kommer att visa mycket mer än att prata om det, så låt oss börja skriva några kod.
I vårt exempel kommer förälderklassen att vara Innehåll
eftersom båda delklasserna - det vill säga Posta
och den Kommentar
- är typer av innehåll som har unik information i samband med dem som inte är specifika för Innehåll
klass.
Nyckeln till arv är att identifiera alla egenskaper och metoder som är vanliga i alla klasser och hålla dem definierade i förälderklassen eller i vår klass i Innehåll
.
Även om detta kan variera beroende på hur du ser det här ställer vi in Innehåll
så att den innefattar:
Först ska vi titta på koden, så ska vi förklara allt som händer med det.
publish_date = $ date-> format ('Y-m-d H: i: s'); $ this-> author = "; public function spara ($ author, $ content) $ this-> författare = $ författare; $ this-> content = $ this-> format_content ($ content); $ this-> content ; public function read () return $ this-> content; privatfunktion format_content ($ content) return strip_tags (stripslashes ($ content)); allmän funktion get_author () return $ this-> author;
Som tidigare nämnts har vi två skyddad
attribut och a privat
attribut. Minns att det här betyder att alla underklasser kan komma åt $ PUBLISH_DATE
och den $ författare
, men endast de Innehåll
kan komma åt $ innehåll
attribut.
Observera också att mycket av koden som du ser i ovanstående klass är grundläggande objektorienterad PHP. Det finns inget som står ut som handlar direkt med arv annat än några av de åtkomstmodifierare som vi har förklarat. Det vill säga att det är relativt vanligt att koda vi hittills har sett i denna handledning.
En av de saker som är värt att notera är att den privata funktionen är på plats för att visa två saker:
privat
funktioner är endast tillgängliga inom ramen för den klass där den definieras.Naturligtvis är den här koden inte ansluten till en databas eller ett filsystem eller något, men punkten är fortfarande kvar.
Observera att i koden ovan finns ett par saker som vi behöver för att tillfredsställa PHP: s krav. De ligger utanför ramen för denna artikel, men det är värt att peka ut här:
date_default_time_set
krävs för att ställa in tidszonen av vilken tiden kan hämtas.Posta
kan ha sin egen författare och Kommentar
kan också ha sin egen författare. Som vi ser senare, a Kommentar
kan till och med överväga standard publiceringsdatum.Observera också att vi kan hämta innehållet från läsa
metod och vi kan få författaren från get_author
fungera.
Låt oss fortsätta och skapa Posta
underklass. Först ska vi titta på koden och sedan ser vi hur det samverkar med Innehåll
klass vi just skapat.
författare = "Tom McFarlin"; public function post ($ content) $ this-> format_content ($ content);
Klassen verkar liten, eller hur? Det finns inga egenskaper - eftersom det ärar från dem Innehåll
klass - och det finns bara två funktioner, varav en är unik för klassen - posta
.
Observera att vi i konstruktören först ringer till förälderkonstruktören med hjälp av ::
operatör. Du kan läsa mycket mer om detta i handboken, men det är tillräckligt att säga att operatören är reserverad för att referera till ett antal skillnader saker utanför klassen där den definieras. I vårt fall är det uppmaningen till förälderens konstruktör.
Därefter har jag valt att ställa in mitt namn som författare till inlägget. Lägg märke till att jag använder $ detta
nyckelord. Eftersom underklassen ärvererar egenskaper från sin förälder kan det referera till dessa egenskaper och om de definierades i sig själv.
Observera att detta är möjligt inte bara för att Posten utökar innehållet
men eftersom egenskapen är markerad som skyddad
i Innehåll
, också. Om det var markerat som privat
, detta skulle inte vara möjligt.
Nu när vi har skapat Posta
klass, vi har också Kommentar
klass som, återkallar, representerar någon som lämnar en kommentar till ett inlägg. Om denna produktionsnivå kodades skulle det finnas mycket mer kod: Vi skulle behöva relatera en kommentar till ett inlägg, bestämma om en kommentar är ett svar på en befintlig kommentar, markera en status för en kommentar och så vidare.
Men i syfte att demonstrera arv, Vi lämnar allt detta ut och fokuserar bara på de saker som kan driva koncepten.
spara ('John Doe', $ kommentar);
Som du kan se, är Kommentar
koden skiljer sig inte mycket från Posta
koda. I viss utsträckning - det här är bra för att det visar att vi har abstraherat de rätta delarna i vår basklass.
Hur som helst, märker att efter att vi konstruerat Kommentar
, vi ringer till förälderkonstruktören. Därefter definierar vi Lägg till
metod som är ansvarig för att ta den inkommande kommentaren och sedan spara den genom att skicka kommentarförfattaren och det är innehållet i spara
metod.
Det fina är att spara
Metoden är redan definierad inom basklassen som också hanterar all formatering genom användning av a privat
funktion, så vi får den funktionen som vi skapar vår barnklass.
Med det gjort, låt oss köra ett par exempel för att visa hur bitarna passar ihop. För att försäkra dig om att den här koden körs, behöver du bara en webbserver, en katalog där du kan köra PHP-skript och en textredigerare.
Först ska vi skapa en förekomst av Innehåll
och då ringer vi ett debug-uttalande så att vi kan se vad som utgör en förekomst av klassen.
$ content = nytt innehåll (); var_dump ($ content);
Att tillåta alla arbeten korrekt bör du se allt som är ovan.
Låt oss fortsätta och skapa ett inlägg. Eftersom vi ställer in all information i klassens sammanhang är allt vi verkligen behöver göra att ringa en funktion i klassen för att visa informationen.
Till exempel:
$ post = ny post (); echo "Författaren är:". $ Post-> get_author ();
Återigen, eftersom vi har satt upp allt i själva koden, visar vi bara på metoden som visar konceptet.
Slutligen kan vi skapa en Kommentar
, ring Lägg till
metod i en förekomst av klassen, försök att skicka in skadlig kod (bara för att se det avlägsnas av vår kod). Om allt går bra bör du se följande:
$ comment = ny kommentar (); $ comment-> add (''); echo "Kommentaren lyder: '. $ Comment-> read ();
Och det är det: Vår enkla demonstration av arv.
När det gäller att titta på arv i WordPress, är det allra första som tänker på mig själv - och troligen andra utvecklare - Widgets API. Anledningen till att jag säger detta beror på att API är drivet av arv.
Visst, widgets kan skapas utan att använda API, men jag skulle argumentera att det är ett fel i utvecklingen. Varför gör sakerna mer komplicerade för dig själv när det redan finns en grund för att göra det? Men jag avviker.
Det fina med det här API: n är att det visar alla höga punkter i objektorienterad programmering och arv på jobbet. Till exempel, här är en del provkod som tagits direkt från Codex:
Nu när vi har täckt begreppsmodellen, tittat på nyckelord och metodik, skrivit vår egen kod och skapat vårt eget exempel borde det vara relativt enkelt att följa.
Men här är det: Ett av de bästa sätten att bli bättre på att skriva någon typ av kod är att ständigt träna koncepten. Det vill säga att utforska de idéer som skrivits av andra människor som har gjort mer avancerade saker som du i tidigare arbete.
Fall i punkt, ta en titt på det första exemplet som finns i WordPress Codex. Och om du arbetar med en senare version av PHP som stöder funktioner som namnområden (ett lite mer avancerat ämne), kolla även i det andra exemplet.
Ju mer du granskar koden och retar den, desto mer ska du lära dig om det. Men går längre än det i den här artikeln kommer vi att ta oss ur omfattningen av hela serien.
Till slutet
Vid denna tidpunkt har vi täckt allt nybörjarmaterial som är nödvändigt för att lägga grunden för en nybörjarguide för att skriva objektorienterat PHP. I den slutliga artikeln kommer vi att ge en sammanfattning av allt vi har täckt så att vi har en enda hänvisning till de stora idéerna som kan bokmärkas, sparas eller hänvisas till senare.
Dessutom har vi en kort diskussion om en uppföljningsserie, men vi sparar det förrän då.
För tillfället, om du har några frågor, kommentarer och / eller feedback om innehållet, koden eller exemplen ovan, kan du göra det i kommentarfältet nedan.