|
Restrictionarea 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 $_ultimeleUnitatiConsumate in clasa Urs():
<?php
class Urs {
public $nume;
public $greutate;
public $varsta;
private $_ultimeleUnitatiConsumate;
public function __construct() {
$this->varsta = 0;
$this->greutate = 100;
$this->_ultimeleUnitatiConsumate = 0;
}
public function mananca($unitati) {
echo $this->nume." mananca ".$unitati." unitati de mancare... ";
$this->greutate += $unitati;
$this->_ultimeleUnitatiConsumate = $unitati;
}
public function afiseazaUltimaMasa() {
echo "Unitatile consumate la ultima masa
au fost ".$this->_ultimeleUnitatiConsumate." ";
}
}
?>
Deoarece variabila $_ultimeleUnitatiConsumate este declarata ca private, orice tentativa de a o modifica va genera o eroare. Iata un exemplu:
<?php
$bob = new Urs;
$bob->nume = "Ursul Bobby";
$bob->mananca(100);
$bob->mananca(200);
echo $bob-> afiseazaUltimaMasa();
$bob->_ultimeleUnitatiConsumate = 1000;
?>
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 clase
Doua 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 clasa UrsPolar() care mosteneste clasa Urs() si defineste o noua metoda:
<?php
class Urs {
public $nume;
public $greutate;
public $varsta;
public $sex;
public $culoare;
public function __construct() {
$this->varsta = 0;
$this->greutate = 100;
}
public function mananca($unitati) {
echo $this->nume." mananca ".$unitati." unitati
de mancare... ";
$this->greutate += $unitati;
}
public function alearga() {
echo $this->nume." alearga... ";
}
public function vaneaza() {
echo $this->nume." vaneaza... ";
}
public function doarme() {
echo $this->nume." doarme... ";
}
}
class UrsPolar extends Urs {
public function __construct() {
parent::__construct();
$this->culoare = "alb";
$this->greutate = 600;
}
public function inoata() {
echo $this->nume." inoata... ";
}
}
?>
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:
<?php
$tom = new Urs;
$tom->nume = "Ursul Tommy";
$bob = new UrsPolar;
$bob->nume = "Ursul Bobby";
$bob->alearga();
$bob->vaneaza();
$bob->inoata();
$tom->alearga();
$tom->vaneaza();
$tom->inoata();
?>
In acest caz, apelul final $tom->inoata() va genera o eroare deoarece clasa Urs() nu contine nici o metoda inoata(). In acelasi timp, instructiunile $bob->alearga() si $bob->vaneaza() vor fi executate cu succes deoarece clasa UrsPolar() mosteneste toate metodele si proprietatile clasei Urs().
In exemplul anterior, poti observa cum a fost apelat constructorul clasei parinte din constructorul clasei UrsPolar(). 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:
<?php
class UrsPolar extends Urs {
function UrsPolar() {
parent::Urs();
$this->culoare = "alb";
$this->greutate = 600;
}
function inoata() {
echo $this->nume." inoata... ";
}
}
?>
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 clasei Urs() astfel incat aceasta sa nu mai poata fi mostenita:
<?php
final class Urs {
}
class UrsPolar extends Urs {
}
$bob = new UrsPolar;
$bob->nume = "Ursul Bobby";
echo $bob->greutate;
?>
|