Ce este încapsularea cu un exemplu simplu în php? Aceasta este funcția părinte

Prin voința sorții, trebuie să citesc un curs special despre modele de design la o universitate. Cursul special este obligatoriu, prin urmare, studenții care vin la mine sunt foarte diferiți. Desigur, printre ei sunt și programatori practicanți. Dar, din păcate, majoritatea oamenilor au dificultăți în înțelegerea termenilor de bază ai POO.

Pentru a face acest lucru, am încercat să explic cu exemple mai mult sau mai puțin vii Noțiuni de bază OOP (clasă, obiect, interfață, abstractizare, încapsulare, moștenire și polimorfism).

Prima parte este dedicată claselor, obiectelor și interfețelor.
A doua parte de mai jos ilustrează încapsularea, polimorfismul și moștenirea

Încapsulare

Să ne imaginăm pentru o clipă că ne aflăm la sfârșitul secolului înaintea trecutului, când Henry Ford nu inventase încă linia de asamblare, iar primele încercări de a crea o mașină s-au confruntat cu critici din partea autorităților pentru faptul că acești monștri fumurii poluează. aerul și sperie caii. Să ne imaginăm că, pentru a conduce prima mașină cu abur, era necesar să știm cum funcționează un cazan cu abur, să adăugăm constant cărbune, să monitorizăm temperatura și nivelul apei. În acest caz, pentru a roti roțile, utilizați două pârghii, fiecare rotind separat câte o roată. Cred că putem fi de acord că conducerea unei mașini la acea vreme era o experiență foarte incomodă și dificilă.

Acum să revenim la astăzi la minunile moderne ale industriei auto cu transmisie automată. De fapt, practic nimic nu s-a schimbat. Pompa de combustibil încă furnizează benzină motorului, diferențialele asigură că roțile se rotesc în unghiuri diferite, iar arborele cotit transformă mișcarea de translație a pistonului în mișcarea de rotație a roților. Progresul este diferit. Acum toate aceste acțiuni sunt ascunse utilizatorului și îi permit să rotească volanul și să apese pedala de accelerație fără să se gândească la ce se întâmplă cu injectorul, supapa de accelerație și arborele cu came în acest moment. Ascunderea proceselor interne care au loc în mașină este cea care îi permite să fie utilizat în mod eficient chiar și de către cei care nu sunt mecanici auto profesioniști cu douăzeci de ani de experiență. Această ascundere în OOP se numește încapsulare.

Încapsulare este o proprietate de sistem care vă permite să combinați datele și metodele care lucrează cu acestea într-o clasă și să ascundeți detaliile
implementări de la utilizator.

Încapsularea este indisolubil legată de conceptul de interfață de clasă. În esență, tot ceea ce nu este inclus în interfață este încapsulat în clasă.

Abstracția

Imaginează-ți că un șofer conduce o mașină de-a lungul unui drum aglomerat. Este clar că în acest moment nu se va gândi la compoziția chimică a vopselei mașinii, la particularitățile interacțiunii vitezelor din cutia de viteze sau la influența formei corpului asupra vitezei (cu excepția cazului în care mașina se află într-un ambuteiaj mort). iar șoferul nu are absolut nimic de făcut). Cu toate acestea, el va folosi în mod regulat volanul, pedalele, semnalizatorul (și eventual o scrumieră).

Abstracția este o modalitate de a evidenția un set caracteristici semnificative obiect, excluzându-le pe cele nesemnificative din considerare. Respectiv, abstractizare este un set de toate astfel de caracteristici.

Dacă ar fi trebuit să ținem cont de compoziția chimică a vopselei caroseriei și de căldura specifică a becului plăcuței de înmatriculare pentru a modela comportamentul mașinii, nu am fi știut niciodată ce este NFS.

Polimorfismul

Orice pregătire de conducere nu ar avea sens dacă o persoană care a învățat să conducă, de exemplu, un VAZ 2106, nu ar putea conduce un VAZ 2110 sau BMW X3. Pe de altă parte, este greu de imaginat o persoană care ar putea conduce în mod normal o mașină în care pedala de accelerație este în stânga pedalei de frână și există un joystick în loc de volan.

Chestia este că principalele elemente de control ale mașinii au același design și principiu de funcționare. Șoferul știe sigur că pentru a vira la stânga trebuie să rotească volanul, indiferent dacă există sau nu servodirecție.
Dacă o persoană trebuie să meargă de la serviciu la casă, atunci se va urca la volanul unei mașini și va efectua aceleași acțiuni, indiferent de tipul de mașină pe care îl folosește. De fapt, putem spune că toate mașinile au aceeași interfață, iar șoferul, făcând abstracție de la esența mașinii, lucrează cu această interfață. Dacă șoferul trebuie să circule de-a lungul autostrazii germane, probabil că va alege o mașină rapidă cu o poziție joasă, iar dacă va trebui să se întoarcă dintr-o tabără îndepărtată de marlin din Munții Altai după ploaie, cel mai probabil va alege un UAZ cu osiile armatei. Dar, indiferent de modul în care este implementată mișcarea și funcționarea internă a mașinii, interfața va rămâne aceeași.

Polimorfismul– aceasta este proprietatea sistemului de a folosi obiecte cu aceeași interfață fără informații despre tipul și structura internă a obiectului.

De exemplu, dacă citiți date dintr-un fișier, atunci, evident, clasa care implementează fluxul de fișiere va avea o metodă similară cu următoarea: octet readBytes(int n);
Acum să presupunem că trebuie să citiți aceleași date de pe un socket. Clasa care implementează socket-ul va avea și o metodă readBytes. Este suficient să înlocuiți un obiect dintr-o clasă cu un obiect al unei alte clase în sistemul dumneavoastră, iar rezultatul va fi atins.

În acest caz, logica sistemului poate fi implementată indiferent dacă datele sunt citite dintr-un fișier sau primite prin rețea. Astfel, facem abstracție de specializarea specifică achiziției de date și lucrăm la nivel de interfață. Singura cerință este ca fiecare obiect folosit să aibă o metodă readBytes.

Moştenire

Să ne imaginăm, pentru o clipă, ca ingineri la o fabrică de mașini. Sarcina noastră este să dezvoltăm o mașină modernă. Noi deja avem modelul anterior, care sa dovedit bine de-a lungul multor ani de utilizare. Totul ar fi bine, dar vremurile și tehnologiile se schimbă, iar fabrica noastră modernă trebuie să se străduiască să îmbunătățească confortul și confortul produselor sale și să respecte standardele moderne.

Trebuie să eliberăm un întreg aliniamentul mașini: sedan, break și hatchback subcompact. Evident, nu vom proiecta o mașină nouă de la zero, dar, luând ca bază generația anterioară, vom face o serie de modificări de design. De exemplu, vom adăuga servodirecție, vom reduce golurile dintre aripi și capotă și vom instala faruri de ceață. În plus, fiecare model va avea o formă diferită a corpului.

Evident, toate cele trei modificări vor avea cele mai multe proprietăți ale modelului anterior (motorul vechi bun din 1970, un șasiu impenetrabil care s-a dovedit excelent pe drumurile interne, o cutie de viteze etc.). În acest caz, fiecare dintre modele va implementa unele funcționalități noi sau caracteristica de proiectare. ÎN în acest caz,, avem de-a face cu moștenire.
Moştenire este o proprietate a sistemului care vă permite să descrieți noua clasa bazat pe unul existent cu funcționalitate împrumută parțial sau complet. Clasa din care se face moștenirea se numește clasă de bază sau părinte. O nouă clasă este o clasă descendentă, moștenitoare sau derivată.

Trebuie remarcat faptul că clasa derivată satisface pe deplin specificația părintelui, dar poate avea funcționalități suplimentare. În ceea ce privește interfețele, fiecare clasă derivată implementează pe deplin interfața clasei părinte. Reversul nu este adevărat.

Într-adevăr, în exemplul nostru, am putea efectua toate aceleași acțiuni cu mașini noi ca și cu cele vechi: creșterea sau scăderea vitezei, întoarcerea, aprinderea semnalizatorului. Totuși, în plus am avea ocazia, de exemplu, să aprindem farurile de ceață.

Lipsa de compatibilitate inversă înseamnă că nu ar trebui să ne așteptăm model vechi reacția corectă la acțiuni precum aprinderea farurilor de ceață (care pur și simplu nu sunt prezente în acest model).

În această lecție vom afla despre primul dintre cei trei piloni ai POO - încapsulare. Încapsulare (latina în capsula; de la capsula „cutie”) - plasare într-o coajă, izolație, închidere a ceva pentru a exclude influența asupra mediului. Veți învăța cum este folosit acest lucru în programarea orientată pe obiecte pe măsură ce parcurgem această lecție.

Proprietăți obiect

Să revenim la subiectul nostru anterior. Cei care au vazut foci stiu ca unele caracteristici ale focilor sunt diferite: culoarea, greutatea, volumul miaunatului etc. Toate obiectele au astfel de semne, inclusiv ale noastre. Și în OOP sunt chemați proprietățile obiectelor. Să dăm exemple de astfel de proprietăți pentru pisici:

  • culoare;

Să creăm acum o clasă care arată mai mult ca o pisică adevărată:

Curs OOP în PHP.

Toate acestea: $nume, $culoare, $greutate - proprietăți ale viitoarelor obiecte din această clasă. Numele proprietății este întotdeauna precedat de modificator de acces. În cazul nostru este public. Acest cuvânt înseamnă că această proprietate va fi disponibilă pentru toți cei care lucrează cu obiecte din această clasă. Există și alți modificatori de acces, dar mai multe despre ei mai jos.

Din nou, acest cod singur nu va scoate nimic în acest moment. Acesta din nou este doar un șablon.

Deci, am făcut un șablon care descrie destul de mult pisicile. Să creăm acum un nou obiect din această clasă.

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

Așa că am creat un obiect cu tipul Cat și l-am aruncat folosind var_dump().

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

După cum puteți vedea, variabila conține un obiect și are trei proprietăți, toate având valori nule. Să reparăm asta. Să dăm un nume pisicii noastre, să o pictăm și să o umplem cu ceva, astfel încât să cântărească ceva. Acest lucru se face astfel:

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

Operatorul -> (o săgeată formată din două caractere - „liniuță” și „mai mare decât”) este folosit pentru a accesa proprietățile unui obiect. În acest cod, am accesat fiecare proprietate separat și le-am atribuit valori. Dacă acum aruncăm $cat1 folosind var_dump() vom obține următoarele:

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

După cum puteți vedea, acesta nu mai este un fel de prostie, ci un bulgăre de zăpadă alb care cântărește trei kilograme și jumătate.

Acum putem accesa proprietatea acestei pisici și putem afla numele acesteia.

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

Și rezultatul este „bulgăre de zăpadă”.

Putem crea mai multe pisici și le oferim proprietăți diferite:

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

Rezultatul este destul de așteptat:

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

Două obiecte diferite cu proprietăți proprii.

Acest lucru este destul de similar cu lucrul cu matrice, ca și cum am scrie o valoare după cheie.

Faptul că există proprietăți în interiorul obiectelor este deja o manifestare a încapsulării. Un obiect are proprietăți, le conține în interiorul său - aceasta este „capsula”.

Metode obiect

Dar obiectele nu se limitează doar la proprietăți. Ele pot avea metode - acestea sunt funcții care aparțin unor obiecte specifice. Le descriem în interiorul clasei, după care aceste funcții devin asociate cu obiectele acestei clase.

Metodele sunt declarate după cum urmează:

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

public este un modificator de acces la o metodă, ceea ce indică faptul că poate fi apelat de toți cei care folosesc obiectul, sayHello este numele metodei, urmat de argumente (în cazul nostru nu există), și apoi corpul metodei, în care tipărim pur și simplu linia „Miau!”;

După cum putem vedea, în general, metodele obiect nu sunt foarte diferite de funcțiile obișnuite. Când le descriem, adăugăm doar un modificator de acces.

Putem numi metoda din soz a acestui obiect. Să creăm o pisică nouă și să-i rugăm să ne salute. Pentru a apela metoda unui obiect, utilizați același operator ca și pentru a accesa proprietățile obiectului ->

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

Acest cod va scoate șirul „Miau!” Așa ne-a întâmpinat o pisică virtuală!

$această variabilă

Da, dar metodele nu sunt așa funcții simple. În interiorul metodelor, este disponibilă o variabilă specială $this, care stochează... obiectul nostru creat în prezent. WOW! Mi-a explodat creierul :)

În realitate, totul nu este atât de complicat. Putem folosi această variabilă pentru a accesa alte metode și proprietăți ale acestui obiect. De exemplu, să învățăm o pisică să spună bună ca un om. Lasă-l să-și spună numele. Pentru a face acest lucru, trebuie să rescriem metoda sayHello() după cum urmează:

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

Și acum, când creăm un nou obiect pisică și îi cerem să ne salute, $this->name va returna valoarea proprietății name a obiectului curent.

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

Acest cod va scoate următoarele:

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

Este atat de simplu. Sper ca acesta exemplu clar v-a ajutat să înțelegeți că $this este doar obiectul curent și că numai obiectul creat are $this.

Ambele metode și $această variabilă - de asemenea încapsularea! Dar asta nu este tot:)

Modificatori de acces

Acum toate proprietățile și metodele obiectelor sunt publice - din orice loc din cod în care acest obiect este accesibil, putem accesa aceste proprietăți și metode. Pentru a face publică o proprietate sau o metodă, utilizați cuvânt cheie public.

Cu toate acestea, există și alți modificatori de acces, iar în această lecție vom studia un alt modificator - privat. Vă permite să faceți proprietățile și metodele unui obiect private, după care vor fi accesibile numai în cadrul acestui obiect.

De exemplu, să schimbăm modificatorul pentru proprietatea nume:

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

Să încercăm acum să schimbăm această proprietate a unui obiect:

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

Vom primi o eroare:

Cu toate acestea, putem scrie metoda publică, care vă va permite să setați această proprietate utilizând-o. Să-i numim setName(). Va lua șirul transmis și va seta această valoare la proprietatea nume.

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

Acum să numim pisicii folosind această metodă:

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

Acum totul a funcționat cu succes și pisica chiar și-a spus numele folosind metoda sayHello(). Totuși, dacă am încerca să-i tipărim pur și simplu numele astfel:

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

atunci vom primi o eroare de acces din nou.

După cum probabil ați observat, folosind metoda setName vă permitem să setați doar un șir la proprietatea nume. Nici un număr, nici o matrice, nici nimic altceva, și anume un șir. Aceasta este o abordare bună - vă permite să utilizați diferite tipuri de validare. La urma urmei, în cadrul metodei puteți efectua câteva verificări înainte de a pune valoarea în proprietate. Acest lucru vă permite să evitați situațiile în care puteți introduce orice prostie în proprietăți. Sunt apelate metode precum setName() care stabilesc valori pentru proprietățile unui obiect setters.

Pentru a obține direct valoarea unei proprietăți private a unui obiect, puteți scrie o altă metodă publică care va returna pur și simplu valoarea acestei proprietăți. Să scriem metoda getName().

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

Acum putem obține pur și simplu numele pisicii din exterior:

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

Astfel de metode, la rândul lor, sunt numite getters.

Modificatorii de acces sunt o altă manifestare a încapsulării.

Constructor

Acum hai să luăm și să spargem o pisică :)

Pentru a face acest lucru, nu îi vom da un nume și vom apela metoda getName().

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

Ce se va intampla? Așa este - o greșeală!

La urma urmei, am descris că getName() ar trebui să returneze întotdeauna un șir. Și obiectul nostru returnează null.

Există vreo modalitate de a garanta că proprietatea nume va conține întotdeauna un șir? Poate sa. Există un constructor pentru aceasta - aceasta este o metodă care este apelată atunci când este creat un obiect din această clasă. În principiu, aceasta este aceeași metodă ca toate celelalte, poate avea argumente diferite. Dar este neapărat apelat automat atunci când este creat un obiect din clasa în care este descris.

Metoda constructorului trebuie să fie numită __construct. Exact așa și nu altfel.

Să creăm un constructor pentru pisica noastră care va avea un argument necesar $name de tip șir.

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

Se obișnuiește să se declare un constructor la începutul unei clase, după declararea proprietăților, dar înaintea altor metode.

Acum, pentru a crea o pisică numită Snowball, trebuie să transmitem un argument când creăm un nou obiect:

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

Și asta s-a întâmplat acum: argumentul a trecut la paranteze rotunde, a fost trecut la metoda __construct(). Acolo această valoare a fost setată la proprietatea nume a obiectului.

Dacă încercăm acum să aflăm numele acestei pisici, îl vom obține.

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

Acum să încercăm să creăm o pisică fără nume la modă veche, fără a trece argumente la crearea unui obiect.

Codul este disponibil numai după achiziționarea cursului OOP în PHP.

Vom primi o eroare.

Aici scrie că constructorul se așteaptă la 1 argument necesar, dar nu am transmis niciunul.

Astfel, avem o clasă de pisici ale căror obiecte nu pot fi create fără nume. Și exact așa ar trebui să fie în lume - toate pisicile ar trebui să aibă nume. De acord, o astfel de lume ar fi mult mai bună decât cea în care trăim. Ei bine, în programare, suntem capabili să construim lumile pe care ni le dorim. Si asta e tare :)

Pentru a rezuma, putem spune că încapsularea este capacitatea obiectelor de a conține proprietăți și metode. Așa îi facem dependenți unul de celălalt în interiorul acestei „capsule”.

Acesta a fost primul pilon al OOP - încapsularea. Ne vedem la următoarea lecție, dar deocamdată să ne facem temele.

Încapsularea este pur și simplu împachetarea unor date într-un obiect. Termenul „încapsulare” este adesea folosit interschimbabil cu „ascunderea informațiilor”. Wikipedia are un articol bun.

_user == null) ( $this->_user = new User(); ) return $this->_user; ) ) clasa Utilizator ( private $_name; funcția publică __construct() ( $this->_name = "Joseph Crawford Jr."; ) public function GetName() ( return $this->_name; ) ) $app = new App( ); echo $app->Utilizator()->GetName(); ?>

Încapsularea este un mecanism care leagă codul și datele pe care le gestionează și îl menține atât de protejat de interferențe externe și de utilizare greșită. Împachetarea datelor și metodelor într-o singură unitate (numită clasă) se numește încapsulare. Avantajul încapsulării este că efectuează sarcina în interior, fără să vă faceți griji.

Încapsularea este o modalitate de a stoca un obiect sau date ca proprietate în interiorul altui obiect, deci obiectul exterior are control total asupra modului în care datele sau obiectele interne pot fi accesate.

De exemplu

Clasa OuterClass (var privat $inneobject; function increment() ( return $this->inneobject->increment(); ) )

Aveți strat suplimentarîn jurul unui obiect care este încapsulat, permițând obiectului exterior să controleze accesul la obiectul interior. Acest lucru, combinat cu privatizarea obiectului/proprietății interne, permite ascunde informațiile .

încapsulare: încapsularea este conceptul de împachetare sau legare a elementelor și metodelor de date asociate într-un singur modul, cunoscut sub numele de încapsulare.

Aici exemplu corectîncapsulare

nume = $n; $acest -> varsta = $a; ) funcția publică setAge($ag) ( $this -> ag = $ag; ) public function display() ( echo "binevenit " . $this -> nume ."
"; returnează $this -> age - $this -> ag; ) ) $person = new person("Pankaj", 25); $person -> setAge(10); echo "Tu ești " . $person -> display () . "varsta";

Oamenii par să confunde detaliile orientării obiectelor cu încapsularea, care este un concept mult mai vechi și mai larg. Structura de date încapsulată

  • poate fi transmis cu o singură referință, de exemplu, increment(myDate), mai degrabă decât increment (an, lună, zi)
  • are un set de operații aplicabile stocate într-o singură unitate de program (clasă, modul, fișier etc.),
  • nu permite clientului să vadă sau să manipuleze subcomponentele sale, CU EXCEPȚIA apelării operațiilor corespunzătoare

Puteți face încapsulare în aproape orice limbă și obțineți beneficii uriașe în ceea ce privește modularea și mentenabilitatea.

Încapsularea este un mecanism de protecție pentru clasă și structura de date. Îți face viața mult mai ușoară. Cu Encapsulation aveți control asupra accesului și setării parametrilor și metodelor de clasă. Ai controlul pentru a spune cât de mult este vizibil pentru cei din afară și cum pot fi setați parametrii obiectelor tale.

Accesarea și setarea parametrilor de clasă

(Mod bun)

gen; ) funcția publică setGender($gen) ( dacă ("masculin" !== $gen și "feminin" !== $gen) (aruncă nou \Exception("Setează bărbat sau femeie pentru gen"); ) $this-> gen = $gen ) )

Acum puteți crea un obiect din clasa dvs. de utilizator și puteți seta în siguranță opțiunile de gen. Dacă setați ceva greșit pentru clasa dvs., atunci va arunca și va exclude. S-ar putea să credeți că acest lucru nu este necesar, dar pe măsură ce codul dvs. crește, ați dori să vedeți un mesaj de excepție semnificativ, mai degrabă decât o problemă de logică incomodă într-un sistem fără excepție.

$user = utilizator nou(); $user->setGender("masculin"); // Se va produce o excepție și nu puteți seta „Y” la genul utilizatorului $user->setGender(„Y”);

(Cale greșită)

Dacă nu faceți rolul de încapsulare, atunci codul dvs. va fi cam așa. Foarte greu de intretinut. Rețineți că putem seta orice pentru proprietatea personalizată de gen.

gen = „mascul”; // Nu se va face nicio excepție și puteți seta „Y” la genul utilizatorului, totuși // în cele din urmă vă veți confrunta cu o problemă logică în sistemul dumneavoastră care este // foarte greu de detectat $user->gender = „Y”;

Accesați metodele clasei

(Mod bun)

fa asta(...); ... $this->doThat(...); ... $this->doThisExtra(...); ) funcție privată doThis(...unii parametri...) ( ... ) funcție privată doThat(...unii parametri...) ( ... ) funcție privată doThisExtra(...unii parametri...) (...))

Știm cu toții că nu ar trebui să facem o funcție cu 200 de linii de cod, ci ar trebui să o împărțim într-o funcție personalizată care descompune codul și îmbunătățește lizibilitatea codului. Acum, cu încapsulare, puteți forța aceste funcții să fie private, adică nu sunt accesibile altora, iar mai târziu, când doriți să schimbați funcția, veți fi bucuros să vedeți cuvântul cheie privat.

(Cale greșită)

Class User (funcția publică doSomethingComplex() ( // face totul aici ... ... ... ... ) )

Opusul încapsulării ar fi ceva de genul transmiterii unei variabile fiecărei metode (cum ar fi un handle de fișier pentru fiecare metodă legată de fișiere) sau variabile globale.

Încapsularea este procesul de eliminare a datelor unui obiect din lumea exterioară și restricționarea accesului la ele la membrii clasei.

Încapsulare: – ambalarea datelor într-un singur dispozitiv. mai putem spune că ascundem informații despre detaliile necesare. Exemplu. Ai un telefon mobil. Există un fel de interfață care vă ajută să interacționați cu telefonul mobil și puteți utiliza serviciile de telefonie mobilă. Dar, de fapt, lucrul la un telefon mobil va dispărea. nu știi cum funcționează în țară.

O asociere elementele de date și metoda împreună într-un singur bloc (adică clasa) este numită încapsulare . Încapsulare ca o capsulă. Aceasta include operațiunile asociate și datele asociate cu un obiect în acel obiect. Încapsularea este ca geanta dvs. în care vă puteți păstra stiloul, cartea etc. Aceasta înseamnă că este proprietatea încapsulării membrilor și funcțiilor.

0) $mark = 10; else $mark = 0; ) ) ) ?>

Mai dau unul exemplu viata reala (utilizare zilnică), care este o „operație de televiziune”. Mulți oameni controlează televiziunea în viața lor de zi cu zi.

Este incapsulat cu un capac si putem actiona telecomanda telecomandăși nu este nevoie să deschideți televizorul și să schimbați canalul. Aici totul este închis, cu excepția telecomenzii, astfel încât toată lumea să poată avea acces fără a fi nevoie să lucreze sau să schimbe lucrurile la televizor.

Prefer doar ca este vizibilitatea proprietăților și metodei clasei tale. De exemplu – – public – privat – protejat

Să ne uităm la un exemplu din viața reală pentru încapsulare.

Clasa MyClass( privat $nume; funcția publică showName($newName)( $this->name = $newName; return $this->name; ) ) //instanțiază obiectul $obj = new MyClass(); echo $obj->showName("tisuchi");

În acest caz, încapsularea înseamnă că restricționăm unele proprietăți. De exemplu, proprietatea nume, nu putem accesa din afara clasei. Pe de altă parte, putem accesa o funcție publică numită showName() cu un parametru privat.

Exact ceea ce prefer să încapsulez,

vizibilitatea proprietății și metodei dvs.

Deși, dacă doriți să înțelegeți încapsularea, vă fac link la tutorialul meu special bazat pe încapsulare.

Sper că acest lucru vă va face conceptul mai clar. A se distra!

Practic, așa definim vizibilitatea proprietăților și metodelor noastre. Când creați clase, ar trebui să vă întrebați ce proprietăți și metode pot fi accesate în afara clasei. Să presupunem că avem o proprietate foo. Dacă o clasă vă extinde clasa, este permis să manipulați și să accesați foo? Ce se întâmplă dacă cineva creează instanțe ale clasei tale? Este permis să manipulezi și să accesezi foo?

Încapsularea este modul în care ați dorit ca obiectele/metodele sau proprietățile/variabilele dvs. să fie vizibile în aplicația dvs. De exemplu, :

Clasa ecap ( $nume public; $id privat; $tax protejat; )

Dacă doriți să accesați proprietăți private sau protejate, trebuie să utilizați metode getter și setter în clasa dvs., care vor fi accesibile din afara clasei dvs. Aceasta înseamnă că nu vă puteți accesa proprietățile private sau protejate direct din afara clasei dvs., dar le puteți utiliza folosind orice metodă. Hai să aruncăm o privire-

în clasă adăugați următoarea metodă:

Clasa ecap (funcția publică userId() ( return $this->id; ) )

și îl putem accesa astfel:

$obj = new ecap(); echo $obj->userId();

PHP, OOP, încapsulare, moștenire, polimorfism

În această lecție vă voi spune despre trei concepte de bază ale programarii orientate pe obiecte: încapsulare, moștenire, polimorfism; Și te voi învăța cum să le folosești în dezvoltare.

Încapsulare

încapsulare - proprietate limbaj de programare care vă permite să combinați și să protejați datele și codul într-un obiect și ascunde implementarea obiect de la utilizator (programator). În același timp, utilizatorul furnizate numai specificație ( interfata) obiect.

Cu alte cuvinte, atunci când lucrăm cu o clasă bine concepută, putem bucură-te numai prin metodele lui, fără a pătrunde înîn modul în care sunt construite și cum lucrează cu câmpurile de clasă. Este despre despre situația în care lucrăm cu o clasă dezvoltată de alți programatori. Pur și simplu folosim funcționalități deja implementate.

Să dăm un alt exemplu. Principiile încapsulării ca ascunderea implementării interne sunt încorporate în orice Funcții PHP. Poate știți deja funcția strpos() pentru lucrul cu corzi din bibliotecă standard PHP. Această funcție caută într-un șir o anumită secvență de caractere și returnează poziția sa ca număr. Dacă ne gândim la implementarea acestei funcții, putem presupune că va trebui să parcurgem fiecare caracter de la începutul liniei pentru o potrivire cu caracterul inițial al secvenței căutate și, dacă da, să comparăm următoarele două caractere, etc. Dar pentru noi ca programatori nu trebuie sa te gandesti mai sus și aprofundați în complexitățile implementării acestei funcții. Avem destule cunoașteți parametrii pe care le acceptă și formatul valoare returnată. Funcția strpos() încapsulează soluția la problema găsirii unui subșir, oferindu-ne doar o interfață externă pentru utilizarea acestuia.

De asemenea, clasele bine concepute își ascund implementarea internă prin expunerea interfeței utilizatorilor externi ca un set de metode.

ÎN limbaj PHP conceptul de încapsulare este implementat sub formă de modificatori speciali de acces la câmpuri și metode ale claselor. Vom vorbi despre asta mai târziu.

Moştenire

Moștenirea este un mecanism de programare orientat pe obiecte care vă permite să descrieți o nouă clasă pe baza deja existente(părinte), în timp ce proprietățile și funcționalitatea clasei părinte sunt împrumutate de noua clasă.

Să luăm un exemplu de moștenire din viața reală. Puteți lua o figură geometrică ca clasă. În același timp, nu precizăm ce cifră anume ar trebui să fie. Ce proprietăți ale figurii pot fi identificate? Să presupunem că are culoare. Atunci clasa care descrie figura trebuie să aibă un câmp corespunzător tip șir, care specifică culoarea formei. De asemenea, orice figură geometrică are suprafata. Fie zona a doua proprietate a clasei noastre.

Acum să presupunem că programul nostru trebuie să funcționeze cu forme geometrice specifice: pătrateȘi triunghiuri, inclusiv poziția lor geometrică pe plan. Evident, descriind triunghiuri și pătrate folosind clasa Figura va fi insuficientă deoarece nu stochează informații despre poziție geometrică. Prin urmare, va trebui să introducem încă două clase: PătratȘi Triunghi. În același timp, să spunem că în programul nostru avem nevoie și de culorile și zonele figurilor. Această situație necesită tocmai folosirea moștenirii. Pentru că orice pătrat și triunghi din program este evident o figură, adică are culoare și zonă. În același timp, fiecare figură necesită date suplimentare (pe lângă culoare și zonă) pentru descrierea sa, care se rezolvă prin introducerea a două clase suplimentare pentru pătrateȘi triunghiuri, care sunt moștenite din clasă Figura.

Asta înseamnă că la cursuri PătratȘi Triunghi nu va trebui să redefinim câmpurile de culoare și zonă. Este suficient să indicați că clasele menționate moștenesc din clasa Figure.

Acum să ne uităm la un alt exemplu, mai apropiat de realitățile programatorilor web. În zilele noastre, diverse bloguri au câștigat o popularitate enormă pe Internet. De fapt, un blog este doar o colecție de articole. Iar esența cheie atunci când dezvoltați un blog este articolul.

Acum să ne imaginăm că în viitorul nostru blog, articolele pot avea Tipuri variate. În primul rând, să ne concentrăm pe două tipuri: un articol obișnuit și un articol de știri. Pentru un articol de știri, data publicării acestuia este importantă, deoarece poartă unele știri specifice.

Pentru a implementa această situație în PHP, va trebui să definim două clase: o clasă pentru un articol obișnuit și o clasă pentru un articol de știri. În același timp, lăsați articolul de știri să extindă capacitățile unui articol obișnuit, de ex. mostenit de la ea. Pentru a moșteni clase în PHP, se folosește cuvântul cheie se extinde.

Clasa (... // conținutul clasei) clasă (... // conținutul clasei)

Următorul cod definește o clasă Articol de stiri ca mostenitor Articol. Clasă Articol la rândul său este părintele clasei Articol de stiri. Aceasta înseamnă că câmpurile și metodele clasei Articol va fi prezent și în clasă Articol de stiri, și nu este nevoie să le redefiniți.

Folosind moștenirea, puteți construi o întreagă ierarhie de clase, moștenind una de la alta. În același timp, orice clasă poate avea un singur părinte:


Uneori poate avem nevoie redefiniți una dintre metodele clasei părinte. Să arătăm din nou implementarea clasei Articol:

Articol de clasă ( ... // câmpuri de clasă // Funcție pentru afișarea funcției articol view() ( echo "

$this->title

$acest->conținut

"; } }

Să presupunem că rezultatul unui articol de știri ar trebui să fie diferit de prezentarea unui articol obișnuit și, în plus, ar trebui să ieșim și momentul publicării știrilor. În același timp, în clasă Articol există deja o metodă vedere(), responsabil pentru ieșirea articolului. O poți face în două moduri. În primul caz, vă puteți gândi la noua metoda in clasa Articol de stiri, de exemplu, cu numele vizualizați știri() special pentru afișarea știrilor. Cu toate acestea, este mai corect să folosiți aceleași metode pentru a efectua acțiuni similare în clasele moștenite. Prin urmare, va fi mai bine dacă metoda de afișare a știrilor în clasă Articol de stiri va fi numit la fel ca în clasa părinte - vedere(). Pentru a implementa o astfel de logică în PHP, este posibil să suprascrieți metodele părinte, adică să setați metode în clasele copil cu nume care se potrivesc clase de părinți. Implementarea acestor metode în clasele părinte în acest caz devine irelevantă pentru clasa descendentă. Să dăm un exemplu de clasă Articol de stiri cu metoda anulată vedere():

Class NewsArticle extinde articolul ( $datetime; // data publicării știrilor // Funcția de afișare a articolului funcția view() ( echo "

$this->title

". strftime("%d.%m.%y", $this->datetime) " Știri

$acest->conținut

"; } }

Următorul cod folosește funcția strftime(), care vă permite să afișați datele într-o formă convenabilă. Pentru a înțelege mai bine codul, consultați specificațiile pentru această funcție din referință. Pentru noi acum este important să acordați atenție faptului că clasa Articol de stiri, precum și Articol, definește metoda vedere(). În consecință, toate obiectele acestei clase vor folosi metoda vedere() declarat în clasă Articol de stiri, nu în Articol.

S-ar putea să vă întrebați: de ce este important să treceți peste unele metode în loc să introduceți metode noi în clasele descendente? Înțelegerea acestui lucru va veni cu înțelegerea următorului concept cel mai important de POO.

Polimorfismul

polimorfism - interschimbabilitatea obiectelor cu aceeași interfață.

Un limbaj de programare acceptă polimorfismul dacă clasele cu aceeași specificație pot avea implementări diferite - de exemplu, implementarea unei clase poate fi modificată prin procesul de moștenire. Este exact ceea ce am văzut în exemplul articolului anterior.

Să ne uităm la următorul exemplu, care dă înţelegerea esenţei polimorfismului:

Clasa A (funcția Test() ( echo „Aceasta este clasa A
"; ) function Call() ( $this->Test(); ) ) clasa B extinde A (function Test() ( echo "Aceasta este clasa B)
"; ) ) $a = nou A(); $b = nou B(); $a->Call(); // afișează: "Aceasta este clasa A" $b->Test(); // afișează: „Aceasta este clasa B” $b->

Fiți atenți la comentariile de pe ultimele trei rânduri. Incearca-l tu insuti explica acest rezultat. Este recomandabil să implementați și să testați singur acest exemplu. Fă-ți timp pentru a te asigura că funcționarea scriptului este complet clară pentru tine, deoarece asta un mic exemplu există un sens profund în spatele OOP. Acum să încercăm să analizăm împreună codul propus.

$a->Call(); // afișează: „Aceasta este clasa A”

Această linie numește metoda Apel() la obiectul clasei A. După cum este definit în funcție Apel() clasă A, metoda este numită Test(). Practicarea metodei Test() la obiectul clasei A, iar textul „Aceasta este clasa A” este afișat pe ecran.

$b->Test(); // afișează: "Aceasta este clasa B"

Această linie numește metoda Test() la obiectul clasei B. Metodă Test() clasă B afișează textul „Aceasta este clasa B”.

$b->Apel(); // afișează: "Aceasta este clasa B"

În cele din urmă, în ultima linie se numește clasa Apel() la obiectul clasei ÎN. Dar în implementarea clasei B nu vom vedea o astfel de metodă, ceea ce înseamnă că este moștenită din clasă A, pentru că clasa B este un descendent al clasei A. Ce vedem în implementarea metodei? Apel() clasă A? Următorul cod:

$this->Test();

Metodă Apel() apelează la o metodă Test() obiectul în care se află. Aceasta înseamnă că metoda va funcționa Test() obiect de clasă B. Acesta este ceea ce explică rezultatul afișat pe ecran.

Despre asta este vorba principiul polimorfismului. Clasele pot avea aceleasi metode, dar implementarea lor este diferită. Când dezvoltăm codul de script, putem cunoaște doar specificația generală a metodelor lor pentru un grup de clase, dar nu avem idee care instanță a clasei va fi utilizată la un anumit moment în timp.

Pot fi numite conceptele de încapsulare, moștenire și polimorfism trei piloni ai POO. Înțelegerea și aplicarea competentă a principiilor acestor concepte - reteta pentru succes dezvoltare folosind POO.