Învățarea PHP. Aceasta este clasa de părinți

_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 folosind o singură referință, de exemplu, increment(myDate) mai degrabă decât increment(an, lună, zi).
  • are un set de operații aplicabile stocate într-un singur modul 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 clasei. 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.

$utilizator = 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 = „bărbat”; // 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(...); ... $aceasta->fa asta(...); ... $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ă creăm o funcție cu 200 de linii de cod, ci ar trebui să o împărțim într-o funcție separată 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, ați fi fericit dacă vedeți cuvânt cheie privat.

(Cale greșită)

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

Curge în jur elementele de date și metoda împreună într-o singură unitate (adică o clasă). Încapsulare. Încapsulare arată ca o capsulă. Aceasta include operațiunile asociate și datele asociate cu un obiect în acel obiect. Încapsularea este ca geanta în care îți poți depozita 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 „funcționare TV”. Mulți oameni controlează televiziunea în viața lor de zi cu zi.

Este încapsulat de o carcasă și putem lucra cu telecomanda telecomandăși nu este nevoie să deschideți televizorul și să schimbați canalul. Totul aici este privat, cu excepția telecomenzii, astfel încât toată lumea să poată accesa fără a fi nevoie să lucreze sau să schimbe lucrurile pe televizor.

Încapsulare: - transferul de date într-un singur bloc. 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 telefon mobil. Dar de fapt lucrând în telefon mobil se va ascunde. nu știi cum funcționează intern.

Prefer doar ca aceasta să fie vizibilitatea proprietății și metodei clasei tale. De exemplu - - public - privat - protejat

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

ÎN În ultima vreme Ideea de programare orientată pe obiecte (OOP), o ideologie radical nouă a scrierii de programe, ocupă din ce în ce mai mult mintea programatorilor.

Programele orientate pe obiecte sunt mai simple, mai portabile și mai ușor de modificat și întreținut decât omologii lor „tradiționali”. În plus, se pare că însăși ideea de orientare a obiectelor, atunci când este utilizată corect, permite unui program să fie și mai protejat de diferite tipuri de erori decât a intenționat programatorul atunci când lucrează la el. Totuși, nimic nu vine gratis: tu însuți
Ideile OOP sunt destul de greu de înțeles de la zero, așa că sunt încă foarte un numar mare de programe ( diverse sisteme Unix, Apache, Perl și eu PHP) sunt încă scrise în vechiul „obiect-non-orientat” C.

Până de curând, PHP a oferit doar suport OOP. Totuși, după eliberare PHP5 Suportul OOP în PHP a devenit aproape complet.

Strategia OOP este cel mai bine descrisă ca o schimbare a priorităților de programare de la funcționalitatea aplicației la structurile de date. Acest lucru permite programatorului să modeleze aplicații create obiecte și situații reale. Tehnologia OOP are trei avantaje principale:

  • este ușor de înțeles: OOP vă permite să gândiți în termeni de obiecte de zi cu zi;
  • foarte fiabil și ușor de întreținut - designul adecvat asigură că programele orientate pe obiecte pot fi extinse și modificate cu ușurință. Structura modulară permite efectuarea de modificări independente în diferite părți ale programului, minimizând riscul erorilor de programare;
  • accelerează ciclul de dezvoltare - și joacă un rol important aici, deoarece diverse componente Programele orientate pe obiecte pot fi folosite cu ușurință în alte programe, ceea ce reduce redundanța codului și reduce riscul introducerii de erori la copiere.

Specificul OOP crește semnificativ eficiența programatorilor și le permite să creeze aplicații mai puternice, scalabile și mai eficiente.

Programarea orientată pe obiecte se bazează pe:

  • Încapsulare;
  • Polimorfism;
  • Moştenire.

Încapsulare

Încapsularea este un mecanism care combină datele și le procesează în cod ca o singură unitate.

Multe dintre beneficiile OOP provin din unul dintre principiile sale fundamentale - încapsularea. Încapsularea este includerea diferitelor elemente mici într-un obiect mai mare, drept urmare programatorul lucrează direct cu acest obiect. Acest lucru are ca rezultat un program simplificat, deoarece detaliile neesențiale sunt eliminate.

Încapsularea poate fi comparată cu funcționarea unei mașini din perspectiva unui șofer tipic. Mulți șoferi nu înțeleg detaliile structura interna mașină, dar în același timp o operează exact așa cum a fost prevăzut. Chiar dacă nu știu cum funcționează motorul, frâna sau direcția, există o interfață specială care automatizează și simplifică aceste operațiuni complexe. Același lucru este valabil și pentru încapsulare și OOP - multe detalii ale „structurii interne” sunt ascunse utilizatorului, ceea ce îi permite să se concentreze asupra soluției sarcini specifice. În OOP, această capacitate este oferită de clase, obiecte și prin diverse mijloace expresii ale relaţiilor ierarhice dintre ele.

Polimorfismul

Polimorfismul vă permite să folosiți aceleași nume pentru similare, dar din punct de vedere tehnic sarcini diferite. Principalul lucru despre polimorfism este că permite manipularea obiectelor prin crearea de interfețe standard pentru acțiuni similare. Polimorfismul face mult mai ușoară scrierea programelor complexe.

Moştenire

Moștenirea permite unui obiect să dobândească proprietățile altui obiect, a nu fi confundat cu copierea obiectelor. La copiere, se creează o copie exactă a obiectului, iar la moștenire, copia exactă este completată cu proprietăți unice care sunt caracteristice doar obiectului derivat.

1

De multe ori îmi pun această întrebare iar și iar. la ce folosește încapsularea datelor în PHP. deși înțeleg utilitatea și utilitatea ascunderii datelor sau a dezvoltării unei implementări a unei aplicații din Public. Sunt de acord cu asta, as putea realiza mare securitate, împiedicând alți dezvoltatori să vadă cum am implementat alte metode. acum în cazul PHP mai am câteva întrebări fără răspuns.

a) Cum mă va ajuta încapsularea datelor în PHP, deoarece PHP nu oferă niciun sistem de criptare (știu că există mai multe, dar mă refer în general) care să-mi cripteze codul sursă pentru a nu fi citit de alții, oricine poate oricând să se întoarcă înapoi să mă uit la sursa mea și să mă schimb în consecință încălcând regulile. acum, acesta prezintă întregul scop al încapsulării datelor, nu-i așa?

Acum ar putea exista o altă situație pe care s-ar putea să trebuie să o rezolv folosind PHP, permiteți-mi să iau în considerare două scenarii în care am două tranzacții în funcție de situație.

SITUAȚIA A:

Clientul A dorește să dezvolte o aplicație Web care va fi stocată local în propriul lor calculator desktop si acces de acolo. în context în această situație nu pot face nimic înainte pentru a împiedica pe cineva să atingă sursa. Încapsularea datelor nu contează aici, văd. nu-i așa?

Situația B:

Trebuie să dezvolt o aplicație web care va fi găzduită pe un server și accesată de acolo și am câteva clase definite care se limitează la sigilare, dar vreau ca alți dezvoltatori să extindă clasa folosind API-ul public. Chiar nu am idee cum pot permite oricui (dezvoltatorilor) să extindă utilizarea clasei mele în această situație? Chiar nu sunt sigur cum funcționează API-ul public?? Aș aprecia dacă cineva ar putea arunca o lumină asupra logicii din spatele implementării API-ului PUBLIC. și aici apare încapsularea datelor în imagine? este aceasta singura situație în care voi avea nevoie de încapsulare pentru a fi implementată în aplicația mea?

  • 2 raspunsuri
  • Triere:

    Activitate

2

Nu utilizați Encapsulation pentru că împiedică oamenii să atingă codul dvs., ci pentru că doriți să creați un API public limitat, dar dedicat pentru obiectele dvs. de mesagerie. Acesta este un element cheie în paradigma OOP. Scopul nu este securitatea, ci susținută și aplicații flexibile. Dacă oamenii vor să-și schimbe codul, lăsați-le. Sunt adulti.

0

Da, le pot rezolva, dar dacă implementez site-ul comerțul electronic, care procesează Tipuri variate sisteme de plată. mai cer altor dezvoltatori să vină să-mi schimbe codul sursă? Și întrebarea principală este dacă oamenii pot accesa mine cod sursa, care se află pe server la distanta, și le poate schimba chiar dacă fișierul are 777 de permisiuni? - Ibrahim Azhar Armar 14 iunie 11 2011-06-14 11:38:12

0

Permisiunile pentru fișiere @Ibrahim nu au nimic de-a face cu conceptul de încapsulare. 777 este disponibil în toată lumea. Declanșează-ți administratorul de sistem dacă el/ea a setat vreo permisiune pentru acest lucru. Dar nu are nicio legătură cu încapsularea sau dezvoltarea software-ului. -

Aceste concepte apar atunci când publicați o bibliotecă sursă închisă. Vrei să te asiguri că are un API public deschis expus ca interfață și vrei să te asiguri că este criptat, astfel încât nimeni să nu-i poată copia elementele interne.

Programele orientate pe obiecte sunt mai simple, mai portabile și mai ușor de modificat și întreținut decât omologii lor „tradiționali”. În plus, se pare că însăși ideea de orientare a obiectelor, atunci când este utilizată corect, permite unui program să fie și mai protejat de diferite tipuri de erori decât și-a propus programatorul atunci când lucrează la el. Totuși, nimic nu vine gratis: tu însuți
Ideile POO sunt destul de greu de înțeles de la zero, motiv pentru care există încă un număr foarte mare de programe (diverse sisteme Unix, Apache, Perl și PHP însuși) sunt încă scrise în vechiul C „non-orientat pe obiecte”.

Până de curând, PHP a oferit doar suport OOP. Cu toate acestea, după lansarea PHP5, suportul OOP în PHP a devenit aproape complet.

Strategia OOP este cel mai bine descrisă ca o schimbare a priorităților de programare de la funcționalitatea aplicației la structurile de date. Acest lucru permite programatorului să modeleze obiecte și situații reale în aplicațiile create. Tehnologia OOP are trei avantaje principale:

* este ușor de înțeles: OOP vă permite să gândiți în termeni de obiecte de zi cu zi;
* foarte fiabil și ușor de întreținut - designul adecvat asigură ușurința de extindere și modificare a programelor orientate pe obiecte. Structura modulară permite efectuarea unor modificări independente în diferite părți ale programului, minimizând riscul erorilor de programare;
* accelerează ciclul de dezvoltare - modularitatea joacă și ea un rol important aici, deoarece diverse componente ale programelor orientate pe obiecte pot fi utilizate cu ușurință în alte programe, ceea ce reduce redundanța codului și reduce riscul introducerii de erori la copiere.

Specificul OOP crește semnificativ eficiența programatorilor și le permite să creeze aplicații mai puternice, scalabile și mai eficiente.

Programarea orientată pe obiecte se bazează pe:

* Încapsulare;
* Polimorfism;
* Moștenirea.

Încapsulare

Încapsularea este un mecanism care combină datele și le procesează în cod ca o singură unitate.

Multe dintre beneficiile OOP provin din unul dintre principiile sale fundamentale - încapsularea. Încapsularea este includerea diferitelor elemente mici într-un obiect mai mare, drept urmare programatorul lucrează direct cu acest obiect. Acest lucru are ca rezultat un program simplificat, deoarece detaliile neesențiale sunt eliminate.

Încapsularea poate fi comparată cu funcționarea unei mașini din perspectiva unui șofer tipic. Mulți șoferi nu înțeleg detaliile structurii interne a mașinii, dar în același timp o conduc exact așa cum a fost intenționat. Chiar dacă nu știu cum funcționează motorul, frâna sau direcția, există o interfață specială care automatizează și simplifică aceste operațiuni complexe. Același lucru este valabil și pentru încapsulare și OOP - multe detalii ale „structurii interne” sunt ascunse de utilizator, ceea ce îi permite să se concentreze pe rezolvarea unor probleme specifice. În OOP, această capacitate este oferită de clase, obiecte și diverse mijloace de exprimare a relațiilor ierarhice dintre ele.

Polimorfismul

Polimorfismul vă permite să utilizați aceleași nume pentru sarcini similare, dar diferite din punct de vedere tehnic. Principalul lucru despre polimorfism este că permite manipularea obiectelor prin crearea de interfețe standard pentru acțiuni similare. Polimorfismul face mult mai ușoară scrierea programelor complexe.

Moştenire

Moștenirea permite unui obiect să dobândească proprietățile altui obiect, a nu fi confundat cu copierea obiectelor. La copiere, se creează o copie exactă a obiectului, iar la moștenire, copia exactă este completată cu proprietăți unice care sunt caracteristice doar obiectului derivat.

Clase și obiecte în PHP

Clasa este concept de bazăîn programarea orientată pe obiecte (OOP). Pentru a spune simplu, o clasă este un fel de tip variabil.

O instanță a unei clase este un obiect. Un obiect este o colecție de date (proprietăți) și funcții (metode) pentru prelucrarea acestora. Datele și metodele sunt numite membri ai clasei. În general, un obiect este orice lucru care acceptă încapsularea.

În cadrul unui obiect, datele și codul (membrii clasei) pot fi fie publice, fie nu. Datele publice și membrii clasei sunt accesibile altor părți ale programului care nu fac parte din obiect. Dar datele private și membrii clasei sunt disponibile numai în interiorul acestui obiect.

Descrierile claselor în PHP încep cu clasa de cuvinte auxiliare:

class Class_name ( // descrierea membrilor clasei - date si metode de procesare a acestora )

Pentru a declara un obiect, trebuie să utilizați operatorul nou:

Obiect = nou ClassName;

Datele sunt descrise folosind cuvântul funcției var. Metoda este descrisă în același mod ca o funcție obișnuită. De asemenea, puteți transmite parametri metodei.

Exemplu de clasă în PHP:

Ioan"; ) ) // Creați un obiect din clasa Coor: $object = new Coor; ?>

Accesarea claselor și obiectelor în PHP

Ne-am uitat la modul în care sunt descrise clasele și cum sunt create obiectele. Acum trebuie să accesăm membrii clasei operatorul -> este folosit pentru aceasta în PHP. Iată un exemplu:

Ioan"; ) ) // Creați un obiect din clasa Coor: $object = new Coor; // Obțineți acces la membrii clasei: $object->name = "Alex"; echo $object->name; // Ieșiri " Alex" // Acum haideți să accesăm metoda clasei (de fapt, o funcție din interiorul clasei): $object->Getname(); // Afișează „John” cu majuscule?>

Pentru a accesa membrii clasei din cadrul unei clase, trebuie să utilizați indicatorul $this, care se referă întotdeauna la obiectul curent. Metoda modificată Getname():

function Getname() ( echo $this->name; ) În același mod, puteți scrie metoda Setname(): function Setname($name) ( $this->name = $name; )

Acum puteți folosi metoda Setname() pentru a schimba numele:

$obiect->Setname(„Petru”); $obiect->Getname();

Și iată lista completă a codurilor:

Nume; ) function Setname($name) ( $this->name = $name; ) ) ) // Creați un obiect din clasa Coor: $object = new Coor; // Acum pentru a schimba numele folosim metoda Setname(): $object->Setname("Nick"); // Și pentru acces, ca și înainte, Getname(): $object->Getname(); // Scriptul scoate „Nick” ?>

Pointerul $this poate fi folosit și pentru a accesa metode, nu doar acces la date:

funcția Setname($name) ( $this->name = $name; $this->Getname(); )

Inițializarea obiectelor

Uneori este nevoie să inițializați un obiect - atribuiți-l proprietăților valorile initiale. Să presupunem că numele clasei este Coor și conține două proprietăți: numele persoanei și orașul reședinței sale. Puteți scrie o metodă (funcție) care va inițializa un obiect, de exemplu Init():

nume = $nume; $this->city = "Londra"; ) ) // Creați un obiect din clasa Coor: $object = new Coor; // Pentru a inițializa obiectul, apelați imediat metoda: $object->Init(); ?>

Principalul lucru este să nu uitați să apelați funcția imediat după crearea obiectului sau să apelați o metodă între crearea (operator new) a obiectului și inițializarea acestuia (apelarea Init).

Pentru ca PHP să știe că o anumită metodă trebuie apelată automat atunci când este creat un obiect, trebuie să i se dea același nume ca și clasa (Coor):

function Coor ($nume) $this->name = $nume; $this->city = "Londra"; )

Metoda care inițializează un obiect se numește constructor. Cu toate acestea, PHP nu are destructori, deoarece resursele sunt eliberate automat la iesirea scripturilor.

Moștenirea și polimorfismul de clasă în PHP

Moștenirea clasei în PHP

Moștenirea nu înseamnă doar a crea copie exacta clasă, ci o extensie a unei clase existente, astfel încât descendentul să poată îndeplini unele funcții noi care îi sunt unice. Sa luam in considerare exemplu concretîn PHP:

Aceasta este funcția părinte

Aceasta este clasa de părinți

"; ) ) clasa Child extinde Parent (funcția child_funct() ( echo "

Aceasta este o funcție de copil

"; ) testul funcției () ( ecou "

Aceasta este o clasă pentru copii

"; ) ) $obiect = Parinte nou; $obiect = Copil nou; $obiect->parent_funct(); // Afișează „Aceasta este o funcție părinte” $object->child_funct(); // Afișează „Acesta este un copil function" $object ->test(); // Afișează "Aceasta este o clasă copil" ?>

Cuvântul cheie extins (vezi exemplu) înseamnă că clasa Child moștenește toate metodele și proprietățile clasei Parent. Clasa părinte este de obicei numită clasa de bază sau superclasa, iar clasa copil Child este clasa sau subclasa derivată.

Polimorfismul de clasă în PHP

Polimorfismul este proprietăți clasa de bază utilizați funcțiile claselor derivate. Studiu de caz, arătând proprietatea clasei - polimorfism.

În această lecție vom afla despre primul dintre cei trei piloni ai POO - încapsulare. Încapsulare (latina în capsula; din capsula „cutie”) - plasare într-o coajă, izolare, î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ățile obiectului

Să revenim la subiectul nostru anterior. Cei care au văzut foci știu că unele semne diferă între foci: culoare, greutate, volumul miaunătului 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. Acum să creăm 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 că 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 - de oriunde în codul unde acest obiect este accesibil, putem accesa aceste proprietăți și metode. Pentru a face publică o proprietate sau o metodă, utilizați un cuvânt cheie public.

Cu toate acestea, există și alți modificatori de acces și î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:

Totuși, putem scrie metoda publică, care vă va permite să setați această proprietate utilizând-o. Să-i spunem 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(). Cu toate acestea, 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 un argument necesar, dar nu am trecut 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.