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:
<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.