Metody magiczne
14 July 2008
Comments
Metody magiczne są nowością w PHP5. Są to metody, które wywoływane są niejawnie:- __construct(): wywoływana w momencie tworzenia egzemplarza obiektu
- __destruct(): wywoływana w momencie usuwania obiektu
- __get(): wywoływana w momencie odczytywania wartości z nieistniejącej właściwości
- __set(): wywoływana w momencie zapisywania wartości w nieistniejącej właściwości
- __call(): wywoływana w momencie wywoływania nieistniejącej metody
- __toString(): wywoływana w momencie wyświetlania obiektu
- __clone: wywoływana w momencie klonowania obiektu.
- __autoload: nie jest metodą magiczną lecz działa podobnie... ładuje plik z klasą.
__construct() i __destruct() to odpowiednio konstruktor i destruktor. Pierwszy zazwyczaj wykorzystywany jest do przygotowania wszystko potrzebnego przez nowo powstały egzemplarz obiektu a destruktor kończy działanie egzemplarza zwalniając zasoby, kończąc połączenia z bazami danych itd. Prosty przykład:
<?php
class foo
{
function __construct()
{
$this->text = 'Cześć, jestem klasa';
echo 'Konstruktor wywołany<br />';
}
function __destruct()
{
unset($this->text);
echo 'Destruktor wywołany';
}
}
$x = new foo();
__get() i __set() ułatwią nam stworzenie mechanizmów dostępowych, co ilustrują przykłady:
<?php
class foo
{
private $dane = array('test' => 'testujemy', 'foo' => 'bar');
public function __get($wlasciwosc)
{
return $this->dane[$wlasciwosc];
}
}
$x = new foo();
echo $x->test;
<?php
class foo
{
private $dane = array('test' => 'testujemy', 'foo' => 'bar');
public function __get($wlasciwosc)
{
return $this->dane[$wlasciwosc];
}
public function __set($wlasciwosc, $wartosc)
{
$this->dane[$wlasciwosc] = $wartosc;
}
}
$x = new foo();
$x->nowe = 'To jest nowa wartość';
echo $x->nowe;
Metoda __call pozwoli nam tworzyć klasy robiące za np. przekierowania do innych klas - np. mamy zbiór klas obsługujących różne bazy danych mające określone metody. Możemy zrobić klasę nadrzędną, która będzie "przekierowywała" do odpowiedniej klasy obsługującej wybraną przez nas bazę danych. Prosty przykład:
<?php
class bar
{
public function show_bar()
{
return 'To jest z klasy bar';
}
}
class foo
{
public function __construct()
{
$this->bar = new bar();
}
public function __call($metoda, $argumenty)
{
IF(method_exists($this->bar, $metoda))
{
return call_user_func_array(array($this->bar, $metoda), $argumenty);
}
}
}
$x = new foo();
echo $x->show_bar();
PHP5 kopiuje obiekty przez odwołanie, a nie przez wartości, dlatego by skopiować zawartość obiektu należy użyć słowa clone. W przeciwnym razie drugi obiekt będzie po prostu odwołaniem do pierwszego.
<?php
class foo
{
function set_tekst($tekst)
{
$this->text = $tekst;
}
function show_tekst()
{
return $this->text;
}
}
$x = new foo();
$x->set_tekst('test 1');
echo $x->show_tekst();
echo '<br /><br />';
$y = clone $x;
$y->set_tekst('test 2');
echo $y->show_tekst();
echo'<br />';
echo $x->show_tekst();
Funkcja __autoload ułatwi nam życie. Jeżeli mamy klasy w jednym katalogu to możemy zautomatyzować proces ich inkludowania:
<?php
function __autoload($class)
{
IF(is_file('classes/'.$class.'.class.php'))
{
include_once 'classes/'.$class.'.class.php';
}
}
$foo = new KLASA();
Jeżeli ścieżka katalogów, w których PHP szuka plików jest długa to funkcja __autoload może działać dość wolno jako że interpreter będzie przeszukiwał wszystkie katalogi z listy zanim wywoła tą funkcję.
RkBlog
Comment article