In Programarea Orientata pe Obiecte (OOP) din PHP exista cateva metode mai speciale, care incep cu "__" (doua caractere '_'), precum __construct(). Acestea sunt numite generic Metode Magice (Magic Methods) si se executa automat in situatii mai speciale, cum ar fi de exemplu __get() pentru accesari de proprietati inexistente.
In aceasta lectie sunt prezentate cateva din cele mai folosite astfel de metode: __get(), __set(), __call() si __toString().
- Toate aceste metode magice trebuie sa fie definite cu atribut public.
Metodele magice: __get() si __set() se folosesc de obicei impreuna si sunt create pentru lucru cu proprietati care nu sunt definite.
<?php // Definire clasa AClas class AClas { // Proprietate care va retine valori atribuite unor proprietati nedeclarate public $prop = array(); // Metoda magica __get() (pt. accesari proprietati nedefinite) public function __get($name) { // Daca exista element cu cheia '$name' in $prop, afiseaza valoarea lui // Altfel, mesaj ca proprietatea nu exista if(array_key_exists($name, $this->prop)) echo $this->prop[$name]. '<br />'; else echo 'Proprietatea <b>'. $name. '</b> nu exista.<br />'; } // Metoda magica __set() (pt. cand se atribuie valori unor proprietati nedefinite) public function __set($name, $value) { // Adauga in $prop element cu cheia $name si valoarea value $this->prop[$name] = $value; echo 'Proprietatea <b>'. $name. '</b> nu exista. S-a atribuit valoarea <i>'. $value. "</i> la proprietatea: <b>prop['$name']</b><br />"; } } // Creare instanta de obiect la clasa AClas $obj = new AClas(); // Apelare proprietate neexistenta $obj->noprop; // Va determina executia metodei __get() // Atribuire valoare la proprietate inexistenta $obj->noprop = 'Valoare pt. noprop - PHP OOP'; // Va determina executia metodei __set() // Apelare din nou a aceleiasi proprietati neexistente $obj->noprop; // Va determina executia metodei __get() // Se verifica direct si elementul pe care-l creaza __set() echo 'Verificare: '. $obj->prop['noprop']; ?>- $prop e definita ca tip Array ca sa stocheze, prin metoda __set(), valorile atribuite unor proprietati nedefinite.
Metoda magica __call() e creata pentru cazuri cand sunt apelate metode inexistente. Sintaxa ei este:
__call($nume, $array_argumente)
- $nume reprezinta numele metodei apelate
- in $array_argumente sunt retinute intr-un Array argumentele adaugate la apelarea metodei.
<?php // Definire clasa AClas class AClas { // Metoda magica __call() (pt. apelari metode nedefinite) public function __call($name, $args) { // Afiseaza un mesaj cu numele metodei apelate si argumentele transmise echo 'Metoda <b>'. $name. '</b> nu exista. Argumente: <i>'. implode(', ', $args). '</i>'; } } // Creare instanta de obiect la clasa AClas $obj = new AClas(); // Apelare metoda inexistenta $obj->site('cursuri', 'tutoriale'); // Va determina executia metodei __call() ?>- In browser va afisa:
Incepand cu PHP 3.0 e adaugata o metoda similara, __callStatic(), aceasta se executa automat cand e apelata o metoda statica nedeclarata, prin formula: NumeClasa::metodaStatica()
Cu metoda __toString() se determina modul de reactie a clasei cand instanta de obiect la ea este folosita ca o variabila de tip sir (String), de exemplu cu "echo".
<?php // Definire clasa AClas class AClas { private $mesaj; // Proprietate // Metoda Constructor public function __construct($mesaj) { // Atribuie valoarea din parametru la proprietatea "mesaj" $this->mesaj = $mesaj; } // Metoda magica __toString() public function __toString() { return $this->mesaj; // Returneaza valoarea proprietatii "mesaj" } } // Creare instanta de obiect la clasa AClas $obj = new AClas('Fii bine primit'); // Apelare instanta, ca pe o variabila de tip String echo $obj; // Va determina executia metodei __toString() ?>- In browser va afisa:
<img src="image.jpg" usemap="#map1"> <map name="map1"> <area shape="rect" coords="9, 120, 56, 149" href="#"> <area shape="rect" coords="100, 200, 156, 249" href="#"> </map>
#id { overflow: auto; }
document.getElementById("id").onmouseover = function(){ document.write("Sa ai Viata Buna"); }
if(isset($_GET["id"])) { echo $_GET["id"]; }
Marc is the boy who won the prize. - Marc e baiatul care a castigat premiul.
Voy a ver al pintor de quien les hablé ayer. - Ma duc sa vad pictorul despre care ti-am vorbit ieri.