Metody magiczne obiektów w PHP5

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.

Metoda __call

Metoda __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');
?>

Metody __set i __get

Pozwalają 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;
?>

Za pomocą tych metod możemy równiez dobrać się do zmiennych nie zdefiniowanych jako publiczne.
<?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;
?>

Jednakże nie zalecałbym takowego zastosowania.

Metody __sleep i __wakeup

Czasami 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>'
?>

Plik drugi: index2.php:
<?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
?>

Metoda __toString

Ostatnią 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;
?>

Podsumowanie

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.

Your rating: Brak Ocena: 3.8 (8 votes)

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.

Dodaj nową odpowiedź

Zawartość pola nie będzie udostępniana publicznie.
  • Adresy internetowe są automatycznie zamieniane w odnośniki, które można kliknąć.
  • Dozwolone znaczniki HTML: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Znaki końca linii i akapitu dodawane są automatycznie.
  • You can use the <go> tags just like the <a> for nicer urls.

Więcej informacji na temat formatowania