Mostenirea este unul din cele mai utile instrumente ale Programarii Orientate pe Obiect - OOP.
Prin mostenire se intelege transmiterea proprietatilor, constanttelor si a functiilor de la o clasa la alta, intr-o structura ierarhica. Prima clasa este clasa de baza, denumita "parinte", legata de aceasta se poate crea o sub-clasa, denumita "copil"; sub-clasa 'copil' mosteneste proprietatile si metodele clasei 'parinte' (cele care sunt cu atribut "public" sau "protected"), le poate folosi in instructiunile din propriul cod si le transmite cand se creaza o instanta de obiect la ea. Precum in natura copii mostenesc genele parintilor.
<?php // Clasa Site class Site { // Definire proprietati, private si public private $site; public $categorie = 'php-mysql'; // Constructor public function __construct($site) { // Daca parametru $site e un Sir cu cel putin 5 caractere, atribuie valoarea la proprietatea "site" // Altfel, seteaza un mesaj de eroare if(is_string($site) && strlen($site)>4) $this->site = $site; else throw new Exception('Valoare incorecta pt. site'); } // Metoda getPag() public function getPag($pag) { // Defineste si returneaza adresa URL a paginii $url = $this->site. '/'. $this->categorie. '/'. $pag; return $url; } } ?>- Metoda Constructor atribuie valoarea din parametru $site la proprietatea "site".
<?php include('class.Site.php'); // Include clasa parinte (Site) // Creare clasa copil LinkSite, extinsa din Site class LinkSite extends Site { // Metoda getLink() public function getLink($pag) { // Afiseaza un link format din getPag() si "categorie" din clasa parinte echo '<a href="http://'. $this->getPag($pag). '" title="'. $this->categorie. '">Link</a><br />'; } } ?>Salvam aceasta clasa, cu denumirea "class.LinkSite.php" in acelasi director unde e salvata si clasa Site.
<?php include('class.LinkSite.php'); // Include fisierul cu subclasa LinkSite // Creare instanta la clasa copil LinkSite $objLink = new LinkSite('marplo.net'); // Apeleaza metoda getLink() (definita in clasa copil); $objLink->getLink('oop-clase-extinse-mostenire.html'); // Modifica valoarea proprietatii "categorie" (aflata in clasa parinte) $objLink->categorie = 'ajax'; // Afiseaza rezultatul dat de metoda getPag() (creata in clasa parinte) echo $objLink->getPag('introducere.html'); ?>- Deoarece clasa LinkSite se afla intr-un fisier PHP extern, o includem cu include().
In exemplu de mai sus, clasa copil LinkSite a mostenit si metoda "__construct()" din clasa parinte Site, fapt ce determina executarea codului din acel Constructor si cand e creata instanta la clasa copil. Uneori aceasta functie nu e adecvata in sub-clasa. Pentru a evita acest lucru, metodele inadecvate pot fi rescrise prin adaugarea uneia cu acelasi nume in clasa copil, astfel, la crearea instantei, va fi utilizata metoda, cu acelasi nume, din clasa copil.
- Rescrierea unei metode nu afecteaza cu nimic pe cea originala, modificarile efectuate sunt valabile doar in clasa copil in care se face rescrierea, respectiv, in alte sub-clase ale ei.
<?php include('class.Site.php'); // Include clasa parinte (Site) // Creare clasa copil PagSite, extinsa din Site class PagSite extends Site { public $domeniu = 'marplo.net'; // Proprietate // Constructor, rescrie pe cel din parinte (Site) function __construct() { // Fara instructiuni, executa nimic } // Metoda getPag(), rescrisa public function getPag($pag) { // Preia functionalitatea metodei getPag() din clasa parinte $url = parent::getPag($pag); // ... alte instructiuni pt. metoda getPag() // Adauga in $url si valoarea proprietatii "domeniu" $url = $this->domeniu. $url; return 'Pagina: '. $url; } } ?>- Prin crearea in aceasta sub-clasa a metodei "__construct()" se anuleaza efectul celei din clasa parinte, si neavand parametru, nici la creare instantei nu se mai adauga vreun argument.
<?php include('class.PagSite.php'); // Include fisierul cu aub-clasa PagSite // Creare instanta la clasa copil PagSite $objPag = new PagSite(); // Modifica valoarea proprietatii "categorie" (aflata in clasa parinte) $objPag->categorie = 'html'; // Afiseaza rezultatul dat de metoda getPag() (rescrisa) echo $objPag->getPag('introducere.html'); ?>- Instructiunea $objPag->getPag('introducere.html') apeleaza metoda "getPag()" din clasa la care s-a creat instanta de obiect (PagSite) deoarece exista cu aceasta denumire in ea. Se observa si din rezultatul afisat:
In exemplu prezentat mai sus se vede cum o metoda din clasa de baza poate fi rescrisa in sub-clasa copil, dandu-i alta functionalitate. Sunt situatii in care nu se doreste ca o metoda sa poata fi rescrisa, in acest caz, prin adaugarea cuvantului final la inceputul declararii metodei se blocheaaaza posibilitatea rescrierii ei.
- De exemplu:
<?php // Clasa Baza class Baza { // Metoda final final public function numeMet() { // Instructiunile functiei } } // Definire clasa-copil din Baza class CopilBaza extends Baza { // Rescriere metoda numeMet() public function numeMet() { // Alte Instructiuni } } ?>- Va genera eroarea:
Precum metodele declarate cu "final" nu mai pot fi modificate in sub-clasa copil, asa se pot crea si clase care sa ramana fixe, fara sa se poata crea din ele alta sub-clasa. Acest lucru se obtine prin adaugarea cuvantului final inainte de class.
- De exemplu:
<?php // Clasa Baza final class Baza { // ... Instructiuni } // Definire clasa-copil din Baza class CopilBaza extends Baza { // ... Alte Instructiuni } ?>- Va genera eroarea:
<table><tr> <th>Title 1</th> <th>Title 2</th> </tr></table>
.some_class { line-height: 150%; }
document.getElementById("id_button").onclick = function(){ window.open("http://coursesweb.net/"); }
$ar_dir = scandir("dir_name"); var_export($ar_dir);
He will sleep there. - El va dormi acolo.
Él dormirá allí. - El va dormi acolo.