Każdy język programowania ma swoje smaczki. W przypadku PHP smaczkiem tym są magiczne metody – znienawidzone przez jednych, nadużywane przez innych. Zastosowane z rozwagą i dobrze użyte mogą znacząco wpłynąć na rozwój kodu. Każda magiczna metoda rozpoczyna się dwoma znakami podkreślenia ( __ ). Twórcy języka wyraźnie zaznaczyli, że konwencja ta jest zarezerwowana wyłącznie dla magicznych metod i nie powinna być stosowana w innych przypadkach.
Konstruktor
Najczęściej używaną przez programistów PHP magią jest konstruktor. Oznaczony jako __construct odpowiada za inicjalizację obiektu. Konstruktor może przyjąć dowolną liczbę argumentów i wbrew pozorom nic nie zwraca.
class Foo
{
protected $_zmienna;
public function __construct($arg1 = null)
{
$this->_zmienna = $arg1;
}
}
Jeśli zwrócimy coś w konstruktorze, dopiero jego jawne wywołanie spowoduje, że wartość ta będzie dostęna.
class Foo
{
public function __construct()
{
return null;
}
}
$foo = new Foo();
var_dump($foo->__construct()); // wyswieli NULL
Konstruktory mogą być podstępne, zwłaszcza jeśli korzystamy z dziedziczenia. Należy pamiętać, iż nadpisanie konstruktora spowoduje, że wykona się konstruktor zadeklarowany najniżej w hierarchii. Pozostałe musimy sami wywołać.
class Foo
{
public function __construct()
{
echo 'Konstruktor Foo';
}
}
class Bar extends Foo
{
public function __construct()
{
echo 'Konstruktor Bar';
}
}
class Baz extends Bar
{
public function __construct()
{
echo 'Konstruktor Baz';
}
}
$baz = new Baz();
Powyższy kod wyświetli tylko jeden tekst – Konstruktor Baz. Dopiero jawne wskazanie, że konstruktor rodzica też ma się wykonać, spowoduje wyświetlenie pozostałych tekstów.
class Foo
{
public function __construct()
{
echo 'Konstruktor Foo';
}
}
class Bar extends Foo
{
public function __construct()
{
parent::__construct();
echo 'Konstruktor Bar';
}
}
class Baz extends Bar
{
public function __construct()
{
parent::__construct();
echo 'Konstruktor Baz';
}
}
$baz = new Baz();
Powyższy kod wyświetli
Konstruktor Foo
Konstruktor Bar
Konstruktor Baz
Jak widać konstruktory wykonują się po kolei. Dzieje się tak dlatego, że wywołanie konstruktora rodzica jest pierwszą instrukcją. Dzięki możliwości sterowania momentem wywołania konstruktora rodzica mamy wpływ na proces inicjalizacji obiektów.
Destruktor
Przeciwieństwem konstruktora jest destruktor, który służy do sprzątania bałaganu po obiekcie. Metoda ta zostanie wywołana w momencie, gdy na dany obiekt nie wskazuje żadna referencja. Podobnie jak w przypadku konstruktorów, destruktory klas nadrzędnych należy wywołać samemu.
class Foo
{
public function __destruct()
{
echo 'Destruktor Foo';
}
}
class Bar extends Foo
{
public function __destruct()
{
parent::__destruct();
echo 'Destruktor Bar';
}
}
class Baz extends Bar
{
public function __destruct()
{
parent::__destruct();
echo 'Destruktor Baz';
}
}
$baz = new Baz();
Przeciążanie metod
W PHP nie ma możliwości zdefiniowania dowolnej ilości takich samych metod z różnymi parametrami. Jeśli ktoś spróbuje takie coś zrobić, niemiło się rozczaruje. Z pomocą przychodzi kolejna magia w postaci dwóch metod: __call oraz __callStatic. Obie metody działają w taki sam sposób, przy czym __call działa z poziomu obiektu, a __callStatic z poziomu klasy. Obie metody zostaną wywołane w przypadku gdy na obiekcie (__call) lub klasie (__callStatic) wywołana zostanie niezdefiniowana metoda.
Zarówno metoda __call jak i __callStatic przyjmują dwa argumenty. Pierwszym z nich jest nazwa wywołanej (nieistniejącej) metody, drugim tablica przekazanych do niej argumentów.
Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...
Zwiń
Czytaj na blogu autora...