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
class masina{ //datele membre ale clasei protected $motor; protected $putere; private $masina; protected $avarii; //constructorul clasei public function masina(){ $this->motor=1.2; $this->putere='20cp'; $this->masina='golf'; $this->avarii=0; } //metoda ce schimba tipul motorului public function <a href="#">modifica_motor</a>($motor_){ $this->motor=$motor_; } //metoda de schimbare a puteri motorului public function modifica_putere($putere_){ $this->putere=$putere_; } //metoda de schimbare a tipului masini public function modifica_masina($masina_){ $this->masina=$masina_; } //metoda afisare a masini,motorului si puterea public function toString(){ echo 'Masina: '.$this->masina.' <br> Motor: '.$this->motor.' <br> Putere:'.$this->putere.'<br>'; } }
Clasa extinsa(clasa care mosteneste masina) arata astfel
class dacie extends masina{ private $an; private $tip; private $masina; //constructorul clasei dacie public function dacie(){ $this->putere='40cp'; $this->motor='1.4'; $this->masina='dacie'; $this->avarii=0; $this->an=1990; $this->tip='berlina'; } // functia de adaugare a unei noi avarii public function adauga_avarie(){ $this->avarii++; } //functia de afisare a daciei public function toString() { parent::toString(); echo 'An:'.$this->an.' <br> Tip:'.$this->tip.'<br> Avarii:'.$this->avarii.'<br>Masina:'.$this->masina.'<br>'; } } //declaram obiectul clasei parinte $ob=new masina(); //afisam masina dupa ce am apelat constructorul $ob->toString(); //setam o noua masina $ob->modifica_masina("Passat"); //setam un nou motor $ob->modifica_motor("2.5"); //setam o noua putere pentru masina $ob->modifica_putere("180cp"); //afisam noua masina $ob->toString();
Dupa apelul metodelor din clasa parinte obtinem aceeasi treaba ca si in primul tutorial
Masina: golf Motor: 1.2 Putere:20cp Masina: Passat Motor: 2.5 Putere:180cp
Acum vom apela metodele clasei extinse si sa vedem care sunt diferentele
//declaram obiectul clasei copil $ob=new dacie(); //afisam clasa copil $ob->toString(); //se adauga o avarie $ob->adauga_avarie(); //se afiseaza clasa copil $ob->toString();
Rezultatul este :
Masina: Motor: 1.2 Putere:40cp An:1990 Tip:berlina Avarii:0 Masina:dacie Masina: Motor: 1.2 Putere:40cp An:1990 Tip:berlina Avarii:1 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.