În articolul precedent, am introdus conceptul de moștenire orientată-obiect, am încercat să-i punem termenii laici și apoi am analizat la nivel înalt modelul conceptual al modului în care funcționează în contextul programării.
Dar, înainte de a merge mai departe și / sau dacă tocmai vă înscrieți în serie, vă rugăm să revedeți tot ce am acoperit până acum prin citirea articolelor anterioare:
Da - am acoperit foarte mult, dar pentru a pune bazele pentru ca un incepator sa aiba un loc puternic din care sa inceapa sa scrie PHP orientat pe obiecte, sunt multe de examinat.
Cu aceasta a spus, moștenirea este locul în care începem să intrăm în subiectele intermediare ale paradigmei, deci acesta va fi ultimul articol care oferă o privire asupra conceptelor începător după care vom termina seria cu un rezumat post.
Reamintim că am definit moștenirea după cum urmează:
Moștenirea este atunci când o clasă servește ca clasă parentală pentru o clasă de copil care oferă un număr de atribute și metode comune atât părintelui cât și copilului; totuși, copilul ca abilitatea de a-și prezenta propriile atribute.
Este un pic mai puțin formal decât ceea ce puteți găsi într-o carte academică sau chiar pe Wikipedia, dar explică încă ideea în termeni care ilustrează punctul.
În acest articol, vom examina toate codurile necesare, funcțiile și cuvintele rezervate legate de subiect, vom examina modul în care putem implementa acest lucru în PHP într-un mod foarte simplu, platformă-agnostic , Și apoi vom analiza o implementare reală a locului în care moștenirea se află în joc în WordPress.
Deci, cu setarea ca foaie de parcurs pentru articol, să mergem mai departe și să începem.
Pentru a implementa moștenirea în PHP orientat-obiect, există o serie de cuvinte rezervate cu care trebuie să ne familiarizăm. Din fericire, majoritatea cuvintelor pe care le-am acoperit deja și cele pe care nu le avem sunt destul de clare, astfel încât este ușor să le amintim.
Așa că, înainte de a ne scufunda în privirea codului, să aruncăm o privire asupra tuturor cuvintelor rezervate în limba pe care trebuie să o cunoaștem, astfel încât să putem începe să fim de fapt creați ceva.
extinde
este un cuvânt rezervat care indică faptul că o clasă este copilul unei alte clase. De exemplu, în articolul nostru anterior, a Post
extinde Conţinut
. Vom vedea asta în curând.privat
este un atribut care se aplică proprietăților și funcțiilor care înseamnă că sunt accesibile numai în contextul clasei în care sunt definite.protejat
este similar cu privat
cu excepția faptului că proprietățile și metodele marcate ca atare pot fi accesate de clasa dată și de orice clasă de copii.public
este opusul privat
în sensul că orice clasă - clasa dată, subclasa sau o clasă terță parte - poate accesa proprietatea sau metoda pentru a-și schimba informațiile sau apela funcția.De asemenea, trebuie să fiți familiarizați cu ::
operatorul, dar vom acoperi acest lucru un pic mai târziu în articol când începem să ne uităm la cod.
Și asta e - nimic teribil de descurajant, nu-i așa? Și ceea ce este chiar mai bine este că dacă ați urmărit alături de noi în întreaga serie, atunci sunteți probabil familiarizați cu fiecare cuvânt, cu excepția extinde
.
Oricum, cu asta am spus, să începem să lucrăm la un exemplu.
Pentru a începe să scriem un exemplu de cod, trebuie să arătăm exact ce anume încercăm să modelăm (la urma urmei, asta face codul, nu-i așa?).
În conformitate cu tema utilizată în această serie - în special în ultimul articol - vom avea o clasă părinte numită Conţinut
, și două clase pentru copii, fiecare dintre care va fi numit cometariu
și Post
, respectiv.
Acest lucru ne va permite să vedem cum există proprietăți și metode într-o singură clasă și cum copiii pot accesa atributele părinților lor, precum și modul în care părinții își pot proteja proprietățile și funcțiile de copiii lor.
Dar implementarea va demonstra mult mai mult decât vorbește despre asta, așa că am început să scriem un cod.
În exemplul nostru, clasa părinte va fi Conţinut
deoarece ambele subclase - adică Post
si cometariu
- sunt tipuri de conținut care au asociate cu acestea informații unice care nu sunt specifice pentru Conţinut
clasă.
Cheia succesiunii este de a identifica toate proprietățile și metodele care sunt comune în toate clasele și de a le menține definite în clasa părinte sau, în clasa noastră, în Conţinut
.
Deși acest lucru poate varia în funcție de modul în care vedeți acest lucru, vom configura Conţinut
astfel încât să includă:
În primul rând, vom examina codul, apoi vom explica tot ce se întâmplă cu el.
publish_date = $ date-> format ('Y-m-d H: i: s'); $ this-> author = "; funcția publică salvați ($ author, $ content) $ this-> author = $ author; $ this-> content = $ this-> format_content ($ content) ; funcția publică read () return $ this-> content; funcția privată format_content ($ content) retur strip_tags (stripslashes ($ content)); funcția publică get_author () return $ this-> author;
După cum am menționat anterior, avem două protejat
atribute și a privat
atribut. Amintiți-vă că acest lucru înseamnă că toate subclasele pot accesa $ PUBLISH_DATE
si $ autor
, dar numai Conţinut
pot accesa conținut $
atribut.
De asemenea, rețineți că o mare parte din codul pe care îl vedeți în clasa de mai sus este PHP bazat pe obiecte de bază. Nu există nimic care iese în evidență, care se ocupă direct de moștenire, altele decât unele dintre modificatorii de acces pe care i-am declarat. Asta inseamna ca este relativ obisnuita codul pe care l-am vazut pana acum in acest tutorial.
Unul dintre lucrurile care merită notate este că funcția privată este în vigoare pentru a demonstra două lucruri:
privat
funcțiile sunt accesibile numai în contextul clasei în care este definită.Desigur, acest cod nu este conectat la o bază de date sau la un sistem de fișiere sau altceva, dar punctul rămâne în continuare.
Rețineți că, în codul de mai sus, există câteva lucruri pe care trebuie să le adăugăm pentru a satisface cerințele PHP. Acestea sunt dincolo de sfera de aplicare a acestui articol, dar merită remarcat aici:
date_default_time_set
este necesar pentru a seta fusul orar de pe care timpul poate fi recuperat.Post
poate avea propriul autor și cometariu
poate avea și autorul său. Așa cum vom vedea mai târziu, a cometariu
poate suprascrie chiar și data implicită de publicare.Rețineți, de asemenea, că putem să preluăm conținutul din citit
și putem să obținem autorul de la get_author
funcţie.
Apoi, să mergem mai departe și să creăm Post
subclasă. În primul rând, vom examina codul și vom vedea cum interacționează cu acesta Conţinut
clasa pe care am creat-o.
autor = 'Tom McFarlin'; post funcțional public (conținut $) $ this-> format_content ($ content);
Clasa pare mică, nu? Nu există proprietăți - pentru că le moștenește de la Conţinut
clasa - și există doar două funcții, dintre care unul este unic pentru clasă - post
.
Observați că, în constructor, mai întâi sunăm la constructorul părinte folosind ::
operator. Puteți citi mult mai multe despre acest lucru în manual, dar este suficient să spunem că operatorul este rezervat pentru a face referire la o serie de diferențe în afara clasei în care este definită. În cazul nostru, acesta este apelul către constructorul părintelui.
Apoi, am ales să-mi pun numele în calitate de autor al postului. Observați că folosesc $ this
cuvinte cheie. Deoarece subclasa moștenește proprietățile de la părintele său, se poate referi la acele proprietăți și dacă acestea au fost definite în sine.
Rețineți că acest lucru nu este posibil doar pentru că Postul extinde conținutul
ci pentru că proprietatea este marcată ca protejat
în Conţinut
, de asemenea. Dacă au fost marcate ca privat
, acest lucru nu ar fi posibil.
Acum că am creat Post
clasa, avem, de asemenea, cometariu
clasă care, amintesc, reprezintă pe cineva care lasă un comentariu pe un post. Dacă era vorba de acest cod la nivel de producție, ar exista mult mai mult cod: Ar fi trebuit să raportăm un comentariu la o postare, să determinăm dacă un comentariu este un răspuns la un comentariu existent, să marcheze un statut al unui comentariu și așa mai departe.
Dar în scopul de a demonstra moştenire, noi lăsăm toate aceste lucruri și ne concentrăm doar asupra lucrurilor care pot conduce conceptele.
salvați ("John Doe", $ comment);
După cum puteți vedea, cometariu
cod nu este mult diferit de Post
cod. Într-o anumită măsură, acest lucru este bun deoarece arată că am abstracționat părțile potrivite în clasa noastră de bază.
Oricum, observați că după ce vom construi cometariu
, suntem invitați la constructorul părinte. Apoi, definim adăuga
metodă care este responsabilă pentru luarea comentariului de intrare și apoi salvarea acestuia prin trecerea autorului comentariului și a conținutului acestuia Salvați
metodă.
Cel mai frumos lucru este că Salvați
metoda este deja definită în cadrul clasei de bază care se ocupă, de asemenea, de toate formatele prin utilizarea unui a privat
astfel încât să obținem acea funcționalitate pe măsură ce creăm clasa noastră de copii.
Cu asta, să vedem câteva exemple pentru a arăta cum se potrivesc piesele împreună. Pentru a vă asigura că acest cod este executat, tot ce aveți nevoie este un server web, un director din care să rulați scripturile PHP și un editor de text.
În primul rând, vom crea un exemplu de Conţinut
și apoi vom apela o instrucțiune de depanare pentru a vedea ce constituie o instanță a clasei.
$ content = conținut nou (); var_dump (conținut $);
Permițând toate lucrările corecte, ar trebui să vedeți tot ce este de mai sus.
În continuare, să mergem mai departe și să creăm un post. Din moment ce setăm toate informațiile în contextul clasei, tot ce trebuie să facem este să apelați o funcție în clasă pentru a afișa informațiile.
De exemplu:
$ post = post nou (); echo 'Autorul postului este:'. $ Post-> get_author ();
Din nou, din moment ce am pus totul în codul în sine, simpla chemare a metodei demonstrează conceptul.
În cele din urmă, putem crea o cometariu
, suna adăuga
metoda pe o instanță a clasei, încercați să introduceți codul rău intenționat (numai pentru a vedea că este dezlegat de codul nostru). Dacă totul merge bine, ar trebui să vedeți următoarele:
$ comment = new Comment (); $ comment-> add (''); echo "Comentariul spune: '. $ Comment-> citit ();
Și asta este: simpla noastră demonstrație de moștenire.
Când vine vorba de a privi moștenirea în WordPress, primul lucru care îmi vine în minte pentru mine - și probabil alți dezvoltatori - este Widgets API. Motivul pentru care spun acest lucru este că API este alimentat de moștenire.
Sigur, widget-urile pot fi create fără a utiliza API-ul, dar aș susține că este o greșeală în dezvoltare. De ce faceți lucrurile mai complicate pentru dvs. când există deja o fundație pentru ao face? Dar mă descurc.
Lucrul frumos despre acest API particular este că prezintă toate punctele de vârf ale programării orientate-obiect și moștenirii la locul de muncă. De exemplu, iată o bucată de cod eșantion luată direct de la Codex:
Acum, că am acoperit modelul conceptual, ne-am uitat la cuvintele cheie și metodologia, am scos propriul cod și am creat exemplul nostru propriu, acest lucru ar trebui să fie relativ ușor de urmat.
Dar aici este chestia: una dintre cele mai bune moduri de a obține mai bine la scrierea oricărui tip de cod este de a practica în mod continuu conceptele. Asta este, pentru a explora ideile scrise de alți oameni care au făcut lucruri mai avansate pe care le-ați în muncă anterioară.
În acest caz, aruncați o privire la primul exemplu furnizat în Codul WordPress. Și dacă lucrați cu o versiune ulterioară de PHP care suportă funcții precum spații de nume (un subiect ușor mai avansat), atunci verificați și al doilea exemplu.
Cu cât veți examina mai mult codul și îl veți distra, cu atât veți afla mai multe despre el. Dar merge mai departe decât în acest articol ne va scoate din sfera de aplicare a întregii serii.
Până la capăt
În acest moment, am acoperit tot materialul începător necesar pentru a pune bazele unui ghid pentru începători în scrierea de obiecte orientate spre PHP. În ultimul articol, vom oferi un rezumat al tuturor lucrurilor pe care le-am acoperit, astfel încât să avem o singură referință pentru ideile mari care pot fi marcate, salvate sau la care se face referire mai târziu.
În plus, vom avea o scurtă perioadă de discuție pe o serie de follow-up, dar vom salva asta până atunci.
Deocamdată, dacă aveți întrebări, comentarii și / sau feedback privind conținutul, codul sau exemplele de mai sus, nu ezitați să faceți acest lucru în secțiunea de comentarii de mai jos.