Mostenirea claselor in php

Post Title

     

Dupa cum am promis in tutorialul trecut am sa scriu un tutorial despre mostenirea claselor si unu despre tratarea erorilor. Acest tutorial este dedicat mostenirii si conceptului de mostenire in php, daca ati citit tutorialul trecut si aiti si inteles ceva atunci mostenirea o sa va para ceva simplu. 

      Conceptul de mostenire se referera la faptul ca o clasa poate mosteni datele membre(atributele si metode) ale altei clase, pentru a mosteni o clasa se defineste o clasa apoi se folseste cuvantul cheie extends urmat de numele clasei pe care dorim sa o mostenim.

      Voi folosi in exemplu clasa din tutorialul trecut despre oop(o sa mai adaug un atribut protected, si modificam motor si putere in protected, o sa explic la sfarsit de ce ). Pe baza clasei masina o sa creem clasa dacie.

        Clasa veche arata astfel

  1.  
  2. class masina{
  3. //datele membre ale clasei
  4. protected $motor;
  5. protected $putere;
  6. private $masina;
  7. protected $avarii;
  8.  
  9. //constructorul clasei
  10. public function masina(){
  11.  
  12. $this->motor=1.2;
  13. $this->putere='20cp';
  14. $this->masina='golf';
  15. $this->avarii=0;
  16. }
  17. //metoda ce schimba tipul motorului
  18.  
  19. public function <a href="#">modifica_motor</a>($motor_){
  20. $this->motor=$motor_;
  21. }
  22. //metoda de schimbare a puteri motorului
  23. public function modifica_putere($putere_){
  24. $this->putere=$putere_;
  25.  
  26. }
  27. //metoda de schimbare a tipului masini
  28. public function modifica_masina($masina_){
  29. $this->masina=$masina_;
  30. }
  31.  
  32. //metoda afisare a masini,motorului si puterea
  33. public function toString(){
  34. echo 'Masina: '.$this->masina.'
  35. <br> Motor: '.$this->motor.'
  36. <br> Putere:'.$this->putere.'<br>';
  37. }
  38. }

 

Clasa extinsa(clasa care mosteneste masina) arata astfel

 

  1.  
  2. class dacie extends masina{
  3. private $an;
  4. private $tip;
  5. private $masina;
  6.  
  7. //constructorul clasei dacie
  8. public function dacie(){
  9. $this->putere='40cp';
  10. $this->motor='1.4';
  11. $this->masina='dacie';
  12. $this->avarii=0;
  13. $this->an=1990;
  14. $this->tip='berlina';
  15. }
  16. // functia de adaugare a unei noi avarii
  17. public function adauga_avarie(){
  18. $this->avarii++;
  19. }
  20. //functia de afisare a daciei
  21. public function toString() {
  22. parent::toString();
  23. echo 'An:'.$this->an.' <br> Tip:'.$this->tip.'<br> Avarii:'.$this->avarii.'<br>Masina:'.$this->masina.'<br>';
  24. }
  25. }
  26.  
  27.  
  28. //declaram obiectul clasei parinte
  29. $ob=new masina();
  30. //afisam masina dupa ce am apelat constructorul
  31. $ob->toString();
  32. //setam o noua masina
  33. $ob->modifica_masina("Passat");
  34. //setam un nou motor
  35. $ob->modifica_motor("2.5");
  36. //setam o noua putere pentru masina
  37. $ob->modifica_putere("180cp");
  38. //afisam noua masina
  39. $ob->toString();

 

Dupa apelul metodelor din clasa parinte obtinem aceeasi treaba ca si in primul tutorial

  1.  
  2. Masina: golf
  3. Motor: 1.2
  4. Putere:20cp
  5.  
  6. Masina: Passat
  7. Motor: 2.5
  8. Putere:180cp

 

Acum vom apela metodele clasei extinse si sa vedem care sunt diferentele

  1.  
  2. //declaram obiectul clasei copil
  3. $ob=new dacie();
  4. //afisam clasa copil
  5. $ob->toString();
  6. //se adauga o avarie
  7. $ob->adauga_avarie();
  8. //se afiseaza clasa copil
  9. $ob->toString();
  10.  

Rezultatul este :

  1.  
  2. Masina:
  3. Motor: 1.2
  4. Putere:40cp
  5. An:1990
  6. Tip:berlina
  7. Avarii:0
  8. Masina:dacie
  9.  
  10. Masina:
  11. Motor: 1.2
  12. Putere:40cp
  13. An:1990
  14. Tip:berlina
  15. Avarii:1
  16. Masina:dacie

 

Cred ca ati observat ca exita un camp "Masina:", am afisat asta deoarece am vrut sa pun in valoare doua aspecte: 

 

       1.Atributele si mtodele care au modificatorul de acces "private" nu pot fi mostenite, doar cele cu public  si protected( protected nu poate fi accesat de obiectul clasei la fel ca private dar poate fi mostenit la fel ca public)

       2.Cuvantul cheie "parent" urmat de operatorul de rezolutie si numele unei metode care exista si in clasa copil va apela clasa parinte ( adica toStringul din clasa masina).

 

Atentie la punctul 2 va merge doar daca versiunea de php este > 5.3

Daca doriti sa redeclarati o metoda procedati ca si cum aceasta nu ar exita ( me refer la redeclararea unei metode in clasa parinte).

Puteti apela din noul obiect al clasei dacie, orice metoda din clasa masina cum ar fi modifica_motor;

Daca aveti nelamuriri lasati comentarii si va raspund, pana data viitoare bafta la poo.

Autor articol
Ştiinţa fără religie este şchioapă, religia fără ştiinţă este oarbă (Albert Einstein)

Structura de aplicatie Angular.js
 

Comentarii

Comentariu adaugat de marian
gandestete la un telefon mobil, ai tastatura, si doar prin tastatura poti scrie pe el, telefonul e o clasa are o metoda publica numita tastatura si doar prin intermediul ei se pate comunica cu telefonul. Ca sa fiu mai clar mecanismele private din el comunica doar prin intermediul celor publice cu exteriorul, cu alte cuvinte datele in clasa iti intra doar prin metode publice, deci vei sti tot timpul pe unde au intrat datele pe unde se pot modifica.
Multumesc pentru interesul tau fata de tutoriale mele si acest site
go to page top marian | 2012-06-21
Comentariu adaugat de danutz0501
Stiu ce e __construct, _destruct pseudo variabila $this metode propietati etc, procedural ma descurc cat de cat, dar nu pot intelege conceptele de baza din spatele OOP, am tot cautat tutoriale dar sincer sant explicate ca dq.
99% dau copy paste la un tutorial gasit pe net, pe care nici ei macar nu il inteleg. Astept si succes la examene
go to page top danutz0501 | 2012-06-21
Comentariu adaugat de marian
Da se poate, doar ca va trebui sa astepti un pic, sunt in sesiune si saptamana asta si cealata mai am examene, dar dupa o sa fac si despre polimorfism, cand te gandesti la oop gandeste-te la functii care sunt puse apelate intr-o alta functie, desi nu e corect sa faci asemenea comparatii iti da o idee despre incapsulare
go to page top marian | 2012-06-21
Comentariu adaugat de danutz0501
Un tutorial despre polimorfism , clone... se poate?
Chiar vrea sa invat oop dar fata de procedural mi se pare ca as invata php iar.
go to page top danutz0501 | 2012-06-21

Exista 4 comentarii   

  • 1
Trebuie sa fii logat sa poti lasa un comentariu Autentificare Inregistrare Logare cu Facebook
top