Clase Si Obiecte in PHP

17
PHP – Clase – Obiecte – Constructori - Mosteniri In PHP, o clasa reprezinta un set de instructiuni care indeplinesc o anumita sarcina. Implementarea unei clase contine atat variabile cat si functii, ea reprezentand un sablon (template) cu ajutorul caruia pot fi create instante specifice. Aceste instante specifice ale unei clase poarta numele de obiecte. Fiecare obiect are o serie de caracteristici, sau proprietati si anumite functii predefinite – metode. Aceste proprietati si metode ale unui obiect corespund variabilelor si functiilor din definitia clasei. O data ce ai creat o clasa, poti defini oricate instante ale acesteia. Fiecare dintre aceste instante reprezinta un obiect independent, ce poate fi manipulat fara ca celelalte obiecte sa fie afectate in vreun fel. Aceasta independenta a obiectelor devine foarte utila atunci cand trebuie sa lucrezi cu doua instante in acelasi timp – de exemplu, doua conexiuni simultane la o baza de date, sau doua interogari, etc. Clasele te ajuta si in cea ce priveste modularitatea codului – poti defini o clasa intr-un fisier separat, incluzandu-l apoi in scripturile care folosesc aceasta clasa. Aceasta modalitatea de implementare simplifica modificarile ulterioare pentru ca, in cazul in care vei dori sa adaugi noi functionalitai obectelor tale, vei avea de modificat un singur fisier. Ca sa intelegem mai bine cele enuntate mai sus, sa luom ca exemplu un anumal, cum ar fi un urs si sa incercam sa il reprezentam ca un obiect.

description

Clase Si Obiecte in PHP

Transcript of Clase Si Obiecte in PHP

PHP Clase Obiecte Constructori - MosteniriIn PHP, o clasa reprezinta un set de instructiuni care indeplinesc o anumita sarcina.Implementarea unei clase contine atat variabile cat si functii, ea reprezentand un sablon (template) cu ajutorul caruia pot fi create instante specifice.

Aceste instante specifice ale unei clase poarta numele de obiecte. Fiecare obiect are o serie de caracteristici, sau proprietati si anumite functii predefinite metode. Aceste proprietati si metode ale unui obiect corespund variabilelor si functiilor din definitia clasei.

O data ce ai creat o clasa, poti defini oricate instante ale acesteia. Fiecare dintre aceste instante reprezinta un obiect independent, ce poate fi manipulat fara ca celelalte obiecte sa fie afectate in vreun fel. Aceasta independenta a obiectelor devine foarte utila atunci cand trebuie sa lucrezi cu doua instante in acelasi timp de exemplu, doua conexiuni simultane la o baza de date, sau doua interogari, etc.Clasele te ajuta si in cea ce priveste modularitatea codului poti defini o clasa intr-un fisier separat, incluzandu-l apoi in scripturile care folosesc aceasta clasa. Aceasta modalitatea de implementare simplifica modificarile ulterioare pentru ca, in cazul in care vei dori sa adaugi noi functionalitai obectelor tale, vei avea de modificat un singur fisier.

Ca sa intelegem mai bine cele enuntate mai sus, sa luom ca exemplu un anumal, cum ar fi un urs si sa incercam sa il reprezentam ca un obiect.

Orice urs are anumite caracteristici varsta, greutatea, sex care sunt echivalente cu proprietatile unui obiect. In plus, fiecare urs are anumite activitati mananca, doarme, merge, alearga si hiberneaza acestea reprezinta metodele unui obiect.

Deoarece toti ursii au in comun anumite caracteristici, putem crea un template Urs(), care defineste caracteristicile de baza si abilitatile fiecarui urs de pe planeta. Aceasta clasa Urs() poate fi utilizata pentru a crea un obiect $urs, proprietatile individuale ale unui Urs putand fi manipulate independent fata de cele ale altor obiecte de acelasi tip.

Avand aceasta clasa putem crea oricati ursi dorim.

Dupa cum se observa din exemplul de mai sus, atunci cand sunt definite noi obiecte, metodele si proprietatile lor pot fi accesate in mod independent pentru fiecare obiect.Definitia unei clase:

Orice definitie a unei clase incepe prin cuvantul cheie class, urmat de numele clasei. Acesta poate fi orice sir de caractere, in afara unui cuvant rezervat PHP, fiind urmat de o pereche de acolade ce include variabilele si functiile clasei.

PHP5 introduce un nou concept care nu este disponibil in PHP4: specificatorii de acces. Acestia controleaza gradul in care proprietatile obiectelor si metodele lor pot fi manipulate din exteriorul clasei, avand un rol important in ceea ce priveste securitatea claselor. Exista trei specificatori de acces, de la cel mai permisiv la cel mai restrictiv: public, private si protected. In definitia unei clase poti marca gradul de vizibilitate al unei proprietati sau metode precedand-o cu unul dintre cele trei cuvinte cheie.

In mod implicit, proprietatile si metodele unei clase sunt public. Aceasta inseamna ca ele pot fi accesate direct si manipulate de catre un script care nu se afla in interiorul clasei. Daca nu doresti acest lucru, il poti impiedica utilizand specificatorii de acces private sau protected, in functie de gradul de control pe care vrei sa il detina un script exterior asupra obiectelor tale. Deoarece in PHP4 nu exista specificatori de acces, definitia clasei de mai sus nu va functiona in PHP4. In schimb, ea poate fi inlocuita cu urmatorul cod:

Avand in fata exemplul de mai sus, poti deduce usor faptul ca in PHP4 toate proprietatile si metodele unui obiect sunt public.Pentru a crea o noua instanta a clasei de mai sus, foloseste cuvantul cheie new:

Codul din exemplul anterior s-ar putea citi ca : "creeaza un nou obiect de tipul Urs si salveaza-l in variabila$tata_urs".

Acum poti accesa toate proprietatile si functiile clasei Urs folosind aceasta variabila. De exemplu, codul:

s-ar traduce ca "atribuie valoarea "Tata urs" variabilei$numea instantei$tata_ursa clasei Urs", in timp ce declaratia:

inseamna "executa functiadoarme()pentru instanta$tata_ursa clasei Urs".

Poti observa ca simbolul "->" este folosit pentru a apela diferitele proprietati si metode ale obiectelor, caracterul "$" fiind omis atunci cand accesam variabilele unui obiect.

Cuvantul cheie "this"Daca vrei sa accesezi functiile si variabilele unei clase chiar in cadrul acesteia, atat PHP4, cat si PHP5, iti pun la dispozitie cuvantulcheie $this, care este folosit ca o referinta la instanta curenta. Pentru a vedea cum functioneaza acesta, sa modificam functia mananca()pentru a primi ca parametru un numar de unitati de mancare care sunt adunate la greutatea unui urs:

In acest caz, prefixul$thisindica faptul ca variabila ce urmeaza a fi modificata a fost definita ca proprietate a clasei. Acest lucru poate fi exprimat ca: "pentru acest obiect, aduna argumentul functieimananca()la variabila$greutate". In concluzie, cuvantul cheie $this iti ofera o metoda facila de a accesa variabilele si functiile "locale" ale clasei.

Iata un exemplu care ilustreaza functionarea sa:

Codul de mai sus va afisa:

Puiul urs cantareste 1000 unitatiFratele puiului cantareste 1000 unitatiPuiul urs mananca 100 unitati de mancare...Puiul urs mananca 50 unitati de mancare...Fratele puiului mananca 11 unitati de mancare...Puiul urs cantareste acum 1150 unitatiFratele puiului cantareste acum 1011 unitati

ConstructoriIn PHP ai posibilitatea de a executa o metoda a unei clase atunci cand este creata o noua instanta a acesteia. Aceasta metoda poarta denumirea de constructor. Pentru a o utiliza, definitia clasei tale in PHP5 trebuie sa contina o functie speciala,__construct().

De exemplu, daca vrei ca toti puii de urs nou-nascuti sa aiba blana maro si cantareasca 100 de unitati, poti folosi codul de mai jos:

In PHP4, constructorul trebuie sa aiba acelasi nume ca si clasa. Iata codul echivalent pentru PHP4:

Sa cream o noua instanta a clasei:

Constructorul va initializa in mod automat proprietatile culoare si greutate pentru fiecare obiect de tipul Urs care este creat. In consecinta, scriptul de mai sus la afisa:

Puiul urs are culoarea maro si cantareste 100 unitati la nastereRestrictionarea accesului

Dupa cum am precizat mai sus, PHP5 permite marcarea proprietatilor si metodelor unei clase ca private, ceea ce inseamna ca ele nu pot fi modificate sau afisate in afara definitiei clasei respective. Acest lucru este util a impiedica manipularea proprietatilor unei clase de catre o instanta a acesteia. Sa consideram urmatorul exemplu, care ilustreaza acest lucru prin adaugarea unei noi variabile private$_ultimeleUnitatiConsumatein clasaUrs():

Deoarece variabila$_ultimeleUnitatiConsumateeste declarata ca private, orice tentativa de a o modifica va genera o eroare. Iata un exemplu:

In mod similar, si metodele unei clase pot fi declarate ca private, ceea ce inseamna ca ele nu pot fi apelate decat din interiorul clasei respective.

Mostenirea unei claseDoua dintre principalele avantaje ale POO, fie PHP4, fie PHP5, sunt extensibilitatea si mostenirea. Aceasta inseamna ca poti crea o clasa noua dintr-o clasa deja existenta, adaugand noi proprietati si metode, si apoi poti defini noi instante ale acestei clase. Aceste obiecte vor avea toate facilitatile mostenite de la clasa parinte, impreuna cu noile proprietati si metode ale clasei copil.

Pentru a ilustra acest concept, sa consideram clasaUrsPolar()care mosteneste clasaUrs()si defineste o noua metoda:

Cuvantul cheie extends este utilizat pentru a crea o clasa copil dintr-o clasa parinte. In acest mod, toate functiile si variabilele din clasa parinte sunt disponibile in clasa copil, dupa cum se poate observa in exemplul de mai jos:

In acest caz, apelul final$tom->inoata()va genera o eroare deoarece clasaUrs()nu contine nici o metodainoata(). In acelasi timp, instructiunile$bob->alearga()si$bob->vaneaza()vor fi executate cu succes deoarece clasaUrsPolar()mosteneste toate metodele si proprietatile claseiUrs().

In exemplul anterior, poti observa cum a fost apelat constructorul clasei parinte din constructorul claseiUrsPolar(). In general, acest lucru este util pentru a ne asigura ca toate initializarile din clasa parinte au fost efectuate inaintea altor initializari in constructorul clasei copil. Daca o clasa mostenita nu are constructor, va fi apelat in mod implicit constructorul clasei pe care o mosteneste.

Iata definitia clasei UrsPolar in PHP4:

Pentru a impiedica mostenirea unei clase sau a unor metode ale sale, foloseste cuvantul cheie final inaintea numelui clasei sau al metodei (aceasta este o facilitate a PHP5 care nu este disponibila in versiunile PHP mai vechi). Iata un exemplu care modifica definitia claseiUrs() astfel incat aceasta sa nu mai poata fi mostenita: