Variabilele (proprietatile) create intr-o clasa pot avea de la inceput o valoare sau pot fi doar simplu declarate, urmand ca valoarea lor sa fie atribuita prin intermediul unei functii (metode). Aceasta functie e denumita generic Metoda Accessor, e la fel ca oricare alta metoda, doar ca scopul ei este de a atribui valori proprietatilor; in rest, se construieste si se apeleaza la fel ca celelalte.
Ca sa vedeti cum functioneaza "metoda accessor", incercati urmatorul exemplu, in care este creata o clasa "SiteClas" cu doua proprietati ('site' si 'categorie'), ambele fara valoare, iar metoda Constructor e folosita si ca accesor, atribuie valori proprietatilor prin parametri ei.
<?php // Se defineste clasa SiteClas class SiteClas { public $site; // Proprietate declarata fara valoare private $categorie; // Proprietate privata, fara valoare // Constructor public function __construct($site, $categorie) { // Atribuie proprietatilor valoarea din parametri $this->site = $site; $this->categorie = $categorie; } // Metoda pt. afisare adresa pagini public function pagini($pag) { // Afiseaza un sir cu adresa URL, www., valoarea celor 2 proprietati si argumentul primit echo '<br />www.'. $this->site.'/'. $this->categorie.'/'. $pag; } } ?>- Cand e creata instanta de obiect la clasa, metoda constructor (care se executa automat) atribuie proprietatilor "site" si "categorie" valorile din parametri, care trebuie adaugate la crearea instantei.
<?php include('class.SiteClas.php'); // Include clasa // Creare instanta de obiect la clasa SiteClas, cu argumentele necesare $objSite = new SiteClas('marplo.net', 'php-mysql'); $objSite->pagini('oop-clase-obiecte.html'); // Apelare metoda pagini() ?>- Dupa executie, in browser va afisa:
Variabilele in PHP nu au un tip de date stabilit precis la declararea lor, de exemplu, o variabila poate sa contina initial ca valoare un numar, iar pe parcursul scriptului sa i-se atribuie ca valoare un sir sau un Array. Aceasta flexibilitate este folositoare, dar in unele situatii poate prezenta probleme in anumite contexte din codul unei metode.
De exemplu, daca intr-o metoda se parcurg datele dintr-o proprietate de tip Array iar in script acea proprietate primeste o valoare de tip Sir, apar erori.
Pentru a fi siguri ca o proprietate primeste doar tipul de date care poate fi corect utilizat, se declara ca private si se folosesc metode accesor pentru accesarea ei, cu functii PHP de verificare a tipului de date. Aceste functii sunt:
<?php // Se defineste clasa SiteClas class SiteClas { // Definire proprietati private, fara valoare private $site; private $categorie; // Constructor public function __construct($site, $categorie) { // Atribuie proprietatilor valoarea din parametri $this->site = $site; $this->categorie = $categorie; } // Metoda accesor - returneaza valoarea proprietatii 'categorie' public function getCategorie() { return $this->categorie; } // Metoda accesor pt. setare valoare la "categorie" public function setCategorie($val) { // Daca $val e de tip Sir (string) si are cel putin un caracter // Atribuie valoarea lui proprietatii 'categorie' // Altfel, returneaza eroare if(is_string($val) && strlen($val)>0) { $this->categorie = $val; } else throw new Exception('Valoare incorecta pt. categorie'); } // Metoda pt. afisare adresa pagini public function pagini($pag) { // Afiseaza un sir cu adresa URL, www., valoarea celor 2 proprietati si argumentul primit echo '<br />www.'. $this->site.'/'. $this->categorie.'/'. $pag; } } ?>- Prin declararea proprietatilor ca "private", se respinge accesul direct la ele in afara clasei, iar pt. proprietatea "categorie" s-a creat posibilitatea de a fi accesata si modificata valoarea ei prin metodele accesor: getCategorie() si setcategorie($val).
<?php include('class.SiteClas.php'); // Include clasa // Creare instanta de obiect la clasa SiteClas $objSite = new SiteClas('marplo.net', 'php-mysql'); // Afiseaza valoarea returnata de getCategorie() (reprezentand valoarea proprietatii "categorie") echo $objSite->getCategorie(); // Modifica prin setCategorie() valoarea proprietatii "categorie" $objSite->setCategorie('html'); $objSite->pagini('introducere.html'); // Apelare metoda pagini() ?>- In browser scriptul va afisa:
Metoda Destructor se creaza cu numele __destruct (doua caractere '_' la inceput). Aceasta metoda este opusul lui __construct. Daca metoda constructor e apelata automat cand se creaza o instanta de obiect la clasa, metoda Destructor se apeleaza automat cand e stearsa, cu unset(), instanta la acea clasa.
Se intelege mai bine din urmatorul exemplu. Clasa Test de mai jos contine o proprietate privata, "nume", o metoda accesor "setNume()", metoda constructor si destructor.
<?php // Clasa Test class Test { private $nume; // Constructor public function __construct($nume) { // Atribuie proprietatii 'nume' valoarea din parametru // si afiseaza un mesaj $this->nume = $nume; echo 'Bine ai venit '. $this->nume. '<br />'; } // Metoda accesor - schimba valoarea proprietatii 'nume' public function setNume($nume) { $this->nume = $nume; } // Metoda Destructor function __destruct() { echo 'Cu bine '. $this->nume; } } ?>- Ca sa testam efectul metodei __destruct, se foloseste urmatorul script (vedeti explicatiile din cod).
<?php // Creare instanta de obiect la clasa Test $obj = new Test('Mar'); // Apeleaza metoda setNume(), care seteaza alta valoarea la prop. 'nume' $obj->setNume('Plo'); // Sterge instanta de obiect $obj unset($obj); ?>- Prin argumentul 'Mar' adaugat la crearea instantei, metoda constructor atribuie aceasta valoare proprietatii "nume", pe care o afiseaza in mesajul returnat.
Metoda destructor este utila cand se doreste executarea automata a unor ultime instructiuni cand instanta la clasa e stearsa din memorie prin apelarea functiei PHP unset().
<input type="number" name="points" min="5" max="80" />
#id { filter:alpha(opacity=40); /* for IE */ opacity:0.4; }
var num = 12.84567; alert( num.toPrecision(3) ); // 12.8
$lang =[10=>"PHP", 20=>"JavaScript", "site"=>"coursesweb.net"); shuffle($lang); var_export($lang); // array (0=>"coursesweb.net", 1=>"PHP", 2=>"JavaScript")
She is the best in our class. - Ea este cea mai buna din clasa noastra.
Él es el mejor en nuestra clase. - El este cel mai bun din clasa noastra.