Menu

Metode Magice

Pana acum stiai de metodele magice __construct si __destruct dar acum este timpul sa le inveti si pe restul, ele sunt mai rar folosite ba chiar niciodata dar este bine sa mai invatam si lucruri de umplutura, nu? Nu prea este recomandat, sunt bune de invatat urmatoarele deoarece va ofera un control mai bun asupra executiei clasei. Dupa cum o sa observati toate metodele magice au prefixul __(doua caractere _).

Lista cu metodele magice:

Metoda Descriere
__construct($parametrii_clasa) Este apelata cand este creata o instanta a clasei
__destruct() Este apelata cand o instanta a clasei este distrusa
__get($nume_variabila) Metoda este apelata cand se apeleaza o variabila care nu exista sau care este inaccesibila(de exemplu este protejata)
__set($nume_variabila, $valoare) Metoda este apelata cand se incearca sa se atribuie o valoare unei variabiabile care nu exista sau care este inaccesibila(de exemplu este protejata)
__call($nume_functie, $parametrii) Metoda este apelata cand se incearca sa se apeleze o functie care nu exista sau este inaccesibila.
__callstatic($nume_functie, $parametrii) Metoda este apelata cand se incearca sa se apeleze o functie statica care nu exista sau este inaccesibila.
__isset($nume) Metoda este apelata cand se testeaza cu functia isset daca o proprietate a clasei exista.
__unset($nume) Metoda este apelata cand se apeleaza functia unset pe o proprietate a clasei.
__toString() Metoda este apelata cand folosesti echo pe obiect.
__invoke() Metoda este apelata cand foloseste obiectul ca pe o functie.
Mai sunt __sleep si __wakeup care nu cred ca o sa le folositi niciodata.


In urmatorul exemplu veti observa ca daca folosim $obj->$var(observati $-ul) iar $var are valoarea aaa se apeleaza variabila $this->aaa

Exemplul urmator va fi mai complicat, aveti nevoie de timp pentru a-l intelege. Cod /test.php:

<?php  
# fisier: /test.php

class Clasa{
	private $test = 'aaaa';
	function __set($nume, $valoare){
		echo 'Metoda magica <b>__set</b> a fost accesata.<br/>';
		if(!isset($this->$nume)){
			$this->$nume = $valoare;
		} else{
			echo '<br/>Nu se pot seta variabile private, doar cele nesetate.';
		}
		echo '<hr/>';
	}

	function __get($nume){
		echo "Metoda magica <b>__get</b> a fost apelata cu parametrul {$nume}<hr/>";
	}

	function __call($nume, $parametrii){
		$p = print_r($parametrii, true);
		echo "Metoda <b>_call</b> a fost apelata. Metoda $nume a fost apelata cu parametrii $p<hr/>";
	}

	public static function __callstatic($nume, $parametrii){
		$p = print_r($parametrii, true);
		echo "Metoda <b>__calstatic</b> a fost apelata. Metoda statica $nume a fost apelata cu parametrii $p<hr/>";
	}

	function __isset($nume){
		echo "Metoda <b>__isset</b> a fost apelata. Exista <b>$nume?</b> <hr/>";
		return isset($this->$nume);
	}
	function __unset($nume){
		echo "Metoda <b>__unset</b> a fost apelata. Se sterge proprietatea {$nume}<hr/>";
		unset($this->$nume);
	}

	function __toString(){
		echo 'Metoda <b>__toString</b>  a fost apelata.<hr/>';
		return 'text obiect';
	}

	function __invoke($parametru){
		echo 'Metoda <b>__invoke</b> a fost apelata. Obiectul a fost apelat ca o functie.<hr/>';
	}
}

$obiect = new Clasa;

echo $obiect->nu_exista; // apelam __get

$obiect->aaa = 'aaa'; // apelam __set pe o proprietate nedefinita

$obiect->test = 'aaa'; // apelam __set pe o proprietate privata.

$obiect->zzzz(); // apelam __call

Clasa::functie_inexistenta(); // apelam __callStatic 

isset($obiect->rrrrr); // apelam __isset

unset($obiect->test); // apelam __unset, observati ca putem sterge metode private cu __unset

echo 'Obiectul transormat in text este: <b>'.$obiect.'</b><hr/>'; // apelam __toString

$obiect('aaa'); // apelam __invoke
?>
Output:



Ti-a placut articolul? Asigura-te ca-ti dam de veste cand publicam altele noi.


Tags: Tutoriale, Programare Web, Php, Curs Php

Comments Nota 0 din 0