Nadszedł czas na ostatnią część cyklu opisującego metody magiczne w PHP. W części pierwszej oraz drugiej omówiłem wiele z nich: konstruktor i destruktor, settery, gettery, metody zwiększające możliwości serializacji obiektów oraz klonowania. W niniejszym tekście przedstawię pozostałe metody magiczne: __callStatic()
, __isset()
, __unset()
, __invoke()
oraz __set_state()
.
Metoda __callStatic()
Metoda ta pojawiła się stosunkowo niedawno, bo dopiero w PHP 5.3. Jest bardzo podobna do omawianej w poprzedniej części zestawienia metody __call()
. Tak jak ona jest używania w momencie wywołania nieistniejącej metody, jednak tylko w przypadku, gdy nastąpiło to w sposób statyczny (tak też musi być sama zdefiniowana). Jako parametry __callStatic()
przyjmuje kolejno nazwę wywołanej metody oraz tablicę zawierającą przekazane do niej parametry. Na poniższym przykładzie widać porównanie obu metod:
class TestCall { public function __call($nazwa, $argumenty) { echo "Wywołano metodę $nazwa z parametrami: " . implode(',', $argumenty) . PHP_EOL; } public static function __callStatic($nazwa, $argumenty) { echo "Wywołano statycznie metodę $nazwa z parametrami: " . implode(',', $argumenty) . PHP_EOL; } } $obj = new TestCall(); $obj->nieistniejacaMetoda('normalne wywołanie'); TestCall::nieistniejacaMetoda('statyczne wywołanie');
Wynik działania powyższego skryptu będzie następujący:
Wywołano metodę nieistniejacaMetoda z parametrami: normalne wywołanie Wywołano statycznie metodę nieistniejacaMetoda z parametrami: statyczne wywołanie
Metody __isset()
oraz __unset()
Pierwsza jest wywoływana w momencie, gdy pojawia się próba dostępu do nieistniejącej właściwości obiektu poprzez funkcję isset()
lub empty()
. Metoda __unset()
jest natomiast wywoływana podczas wykonywania funkcji unset()
na nieistniejącej właściwości. Obie przyjmują jako parametr nazwę wywołanej właściwości. Poniższy przykład obrazuje sposób działania opisanych metod:
class TestowaKlasa { public function __unset($nazwa) { echo "Nie można usunąć '$nazwa', zmienna nie isnieje!" . PHP_EOL; } public function __isset($nazwa){ echo "Właściwość '$nazwa' nie istnieje!" . PHP_EOL; } } $obj = new TestowaKlasa(); unset($obj->nieistniejacaWlasciwosc); isset($obj->nieistniejacaWlasciwosc);
Efekt działania będzie następujący:
Nie można usunąć 'nieistniejacaWlasciwosc', zmienna nie isnieje! Właściwość 'nieistniejacaWlasciwosc' nie istnieje!
Metoda __invoke()
Została wprowadzona w PHP 5.3 i jest wywołana w momencie, gdy następuje próba użycia obiektu w sposób przeznaczony dla funkcji. Poszczególne parametry odpowiadają tym użytym w wywołaniu obiektu. Warto pamiętać, że gdy klasa posiada zdefiniowaną metodę __invoke()
, zastosowanie na jej obiekcie funkcji is_callable()
zwróci w rezultacie true
.
class MojaKlasa { public function __invoke($parametr1, $parametr2) { var_dump($parametr1, $parametr2); } } $obj = new MojaKlasa(); $obj('abc', 123); var_dump(is_callable($obj));
Wynik działania powyższego skryptu będzie następujący:
string(3) "abc" int(123) bool(true)
Metoda __set_state()
Jest to metoda statyczna, która jest wywoływana w momencie użycia na klasie funkcji var_export()
. Przyjmuje jeden parametr, zawierający eksportowane właściwości w formacie: array('wlasciwosc1' => wartosc, 'wlasciwosc2' => wartosc, …)
. Obrazuje to przykład zaczerpnięty z dokumentacji:
class MojaKlasa { public $w1; public $w2; public static function __set_state($tab) { $obj = new MojaKlasa(); $obj->w1 = $tab['w1']; $obj->w2 = $tab['w2']; return $obj; } } $obj = new MojaKlasa(); $obj->w1 = 123; $obj->w2 = 'abc'; eval('$b = ' . var_export($obj, true) . ';'); var_dump($b);
object(MojaKlasa)#2 (2) { ["w1"]=> int(123) ["w2"]=> string(3) "abc" }
Podsumowanie
To była ostatnia część z cyklu „Metody magiczne w PHP”. W poszczególnych artykułach omówiłem wszystkie, jakie występują w PHP 5.3. Mam nadzieję, że wyjaśniły one mechanizmy, które mogą być bardzo przydatne w programowaniu obiektowym.
Jeden Komentarz
Prosto i zrozumiale, dzięki.