PHP5 udostępnia nam zestaw tzw. "metod magicznych", które niezmiernie ułatwiają pracę programićcie z obiektami. Są to normalne metody, które mają z góry nadane nazwy aby mogły być wywoływane automatycznie w określonych sytuacjach.
Do tej pory poznaliśmy dwie __construct() i __destruct(). Wywoływane są one w momencie tworzenia, jak i niszczenia obiektu. Część metod pozwala na dostęp do metod i właściwości, które nie zostały jawnie zdefiniowane. Inne na przykład definiują działania wykonywane, kiedy obiekt zostaje użyty jako ciąg znaków.
__callMetoda __call() służy na wykonywanie różnych operacji i zwracanie danych niezdefiniowanych metod. Dzieki niej możemy np. symulować przeciążenia metod czy przygotować obsługę błędów, kiedy użytkownik przykładowo poda zła ilość parametrów. Metoda ta w definicji musi zawierać dwa parametry. Pierwszy określa nazwę metody jaka została wywołana, drugi tablicę parametrów przekazanych tej metodzie.
<?php
class JakasKlasa
{
public function __call($nazwametody, $parametry){
echo 'Wywołana została metoda '.$nazwametody.' i przekazano jej parametry:';
print_r($parametry);
}
}
$o=new JakasKlasa();
$o->niezdefiniowana_metoda('parametr1','parametr2','parametr3');
?>__set i __getPozwalają one na zapis jak i doczyt właściwości niezdefiniowanych w klasie. Metoda __get przyjmuje jeden parametr, nazwę danej właściwości, natomiast metoda __set dwa, nazwę właściwości oraz jej wartość.
<?php
class JakasKlasa
{
public function __get($nazwa){
return $this->$nazwa;
}
public function __set($nazwa,$wartosc){
$this->$nazwa=$wartosc;
}
}
$o=new JakasKlasa();
$o->zmienna='jakas wartosc';
echo $o->zmienna;
?><?php
class Klasa {
private $zmienna='wartość początkowa';
public function __get($n){
return $this->$n;
}
public function __set($n, $w){
$this->$n=$w;
}
}
$o=new Klasa();
echo $o->zmienna.'<br />';
$o->zmienna='wartość końcowa';
echo $o->zmienna;
?>__sleep i __wakeupCzasami zdarza się tak, że musimy przekazać jakieś dane pomiędzy stronami, które musza być długo przechowywane. Dzięki tym metoda będziemy w stanie to zrealizować. Często zadarza nam się serializować obiekty czyli przekształcać je do postaci łańcucha znaków i zapisujemy do bazy, pliku czy sesji. Te metody, bardzo ułatwiają takie działania. __sleep() jest wywoływane bezpośrednio przed serializacją(funkcja serialize()) obiektu, a metoda __wakeup() przed unserialize(). Przykładem użycia tych metod, może być np. konieczność rozłączenia sie z bazą, lub wyczyszczenia zasobu ze zmiennej, przed jej serializacją. Jak zapewne wiemy zasoby nie dadzą się serializować.
Plik pierwszy index.php:
<?php
class JakasKlasa {
private $conn; //tu bedziemy wstepnie przechowywać zasób polączenia
public function __construct(){
/**
* uwaga takie wywołanie funkcji mysql_connect zadziała w przypadku
* kiedy mamy zdefiniowane domyślne parametry połlączenia z bazą w php.ini
*/
$this->conn=mysql_connect();
}
public function __sleep(){
mysql_disconnect($this->conn);
$this->conn=null;
echo 'Usypianie obiektu';
}
public function __wakeup(){
$this->conn=mysql_connect();
echo 'Wybudzanie obiektu';
}
/**
* Inne metody właściwości obiektu
*/
}
session_start();
$o=new JakasKlasa();
//bez użycia __sleep, dostalibyśmy komunikat, że serializacja jest niemożliwa
$_SESION['c']=serialize($o);
echo '<a href="index2.php">index2.php - "budzenie" obiektu</a>';
?><?php
class JakasKlasa {
private $conn; //tu bedziemy wstepnie przechowywać zasób polączenia
public function __construct(){
$this->conn=mysql_connect();
}
public function __sleep(){
mysql_disconnect($this->conn);
$this->conn=null;
echo 'Usypianie obiektu';
}
public function __wakeup(){
$this->conn=mysql_connect();
echo 'Wybudzanie obiektu';
}
/**
* Inne metody, właściwości obiektu
*/
}
session_start();
$o=unserialize($_SESSION['c']);
//dalsze działania na obiekcie
?>__toStringOstatnią metoda magiczną jest __toString(), motoda ta zwraca nam tekstową reprezentacje naszego obiektu. W dużym uproszczeniu możemy powiedzieć, że jest to automatyczna konwersja obiektu do stringu.
<?php
class Prostokat{
public $x=0;
public $y=0;
public function __toString(){
return 'Nasz obiekt reprezunteje klase '.__CLASS__.' o x='.$this->x.' i y='.$this->y;
}
}
$o=new Prostokat();
$o->x=5;
$o->y=2;
echo $o;
?>Jak widać w powyższym artykule, model obiektowy został bardzo rozbudowany w PHP5, co umożliwia nam wykorzystanie różnych drzemiących możliwości, których brak w innych językach.
Zmieniłbym zdanie: Pierwszy
Zmieniłbym zdanie:
Pierwszy określa nazwę metody jaka została wywołana, drugi jakie podano jej parametry.
Na:
Pierwszy określa nazwę metody jaka została wywołana, drugi tablicę parametrów przekazanych tej metodzie.
Seria tych tekstów jest naprawdę dobra - dobra robota, Mephir.
Dzięki, rzeczywiście może
Dzięki, rzeczywiście może brzmieć dziwnie, zaraz zmienie, a swoją drogą myślałem że to będzie koniec o metodach magicznych a mz racjiiż w PHP 5.3 zaszłe niedu że zmiany to będe pisał następny artykuł.
Dodaj nową odpowiedź