Metody magiczne w PHP, część pierwsza

Programując obiektowo w PHP, możemy skorzystać z kilku specjalnych metod, zwanych magicznymi, które mogą zostać użyte wewnątrz klas. Dzięki nim uzyskamy wiele dodatkowych możliwości podczas korzystania z obiektów. W niniejszej, pierwszej części z serii artykułów opisującej te zagadnienia, przedstawię konstruktor, destruktor oraz metody __set(), __get()  i __call().

Konstruktor i destruktor

Są to dwie podstawowe metody, których wywołanie następuje odpowiednio podczas tworzenia nowego obiektu oraz przy jego usuwaniu. Konstruktor służy do zainicjowania obiektu, przypisania właściwości oraz wykonania podstawowych operacji podczas jego tworzenia.

Destruktor jest wywoływany automatycznie w momencie usuwania obiektu. Bardzo ważne jest to, że samodzielne wywołanie tej metody nie usuwa obiektu. W przypadku takiego działania zostanie po prostu wykonany zdefiniowany w destruktorze kod, jednak obiekt będzie istniał dalej. Jeśli chcemy sami go usunąć , możemy skorzystać z jednej z następujących możliwości:


unset($object);
$object = null;

Nie mamy obowiązku definiowania konstruktora i destruktora, domyślnie są one puste.

Na poniższym przykładzie przedstawiono działanie konstruktora i destruktora:


class MyClass
{
   public $variable;
   public function __construct($variable)
   {
      $this->variable = $variable;
      echo "Obiekt został utworzony";
   }

   public function __destruct()
   {
      echo "Obiekt został zniszczony";
   }
}

$object = new MyClass(123);
$object->__destruct();
var_dump($object);

Wynik działania skryptu będzie następujący:


Obiekt został utworzony
Obiekt został zniszczony
object(MyClass)#1 (1) {
   ["variable"]=>
   int(123)
}
Obiekt został zniszczony

Jak  można zauważyć obiekt został utworzony, w wyniku czego nastąpiło wywołanie konstruktora, który przypisał odpowiednią właściwość. W kolejnym kroku wywołano destruktor, co jak widać w dalszej części nie usunęło obiektu, a jedynie wykonało jego kod (wyświetlenie komunikatu). Można to zaobserwować w wyniku funkcji var_dump(). Ostatecznie obiekt został usunięty w momencie zakończenia skryptu – destruktor został wywołany ponownie, tym razem automatycznie.

Metody __get() oraz __set()

Są to metody wywoływane w momencie, gdy następuje próba dostępu do nieistniejącej właściwości obiektu. Metoda __get() zostanie wykonana, gdy będziemy pobierali taką właściwość. Posiada ona jeden parametr, do którego zostaje przypisana nazwa wywoływanej właściwości.

Analogicznie metoda __set() wywoła się, gdy będziemy chcieli ustawić nieistniejącą właściwość obiektu. Przyjmuje ona dwa parametry, kolejno: nazwa oraz wartość.

Należy pamiętać, że gdy nie zdefiniujemy powyższych metod, to w przypadku odczytu nieistniejącej właściwości otrzymamy null, natomiast gdy będziemy chcieli do takiej przypisać wartość, zostanie ona w tym momencie utworzona.

Można to zobaczyć analizując działanie następującego skryptu:


class MyClass
{
   /* ... */
}

$object = new MyClass();
$object->undefinedVariable = 123;

var_dump($object);
var_dump($object->anotherUndefinedVariable);

Efekt jego działania będzie następujący:

object(MyClass)#1 (1) {
   ["undefinedVariable"]=>
   int(123)
}
NULL

Na poniższym przykładzie przedstawiono zasadę działania metod __get() oraz __set():


class MyClass
{
   public function __construct()
   {
      echo $this->undefinedVariable;
   }

   public function __get($name)
   {
      echo "Obiekt nie posiada właściwości $name";
   }

   public function __set($name,  $value)
   {
      echo "Obiekt nie posiada właściwości $name, nie można więc przypisać 
wartości $value";
   }
}

$object = new MyClass();
$object->anotherUndefinedVariable = 678;

Wynikiem działania skryptu będzie:


Obiekt nie posiada właściwości undefinedVariable
Obiekt nie posiada właściwości anotherUndefinedVariable, nie można więc 
przypisać wartości 678

W momencie tworzenia obiektu poprzez konstruktor nastąpiła próba odczytania zmiennej  undefinedVariable, co spowodowało wywołanie metody __get(). Gdy wykonano przypisanie do nieistniejącej właściwości anotherUndefinedVariable, aktywowana została metoda __set();

Metoda __call()

Metoda ta działa analogicznie do poprzednio omówionych, dotyczy jednak metod obiektu. W przypadku, gdy nie zdefiniujemy __cal() i wywołujemy nieistniejącą metodę, zostanie wyświetlony odpowiedni błąd, a działanie skryptu zatrzymane:


Fatal error:  Call to undefined method MyClass::undefinedMethod() 
in /sciezka/do/pliku/skrypt.php on line 13

Po zdefiniowaniu w klasie metody __call(), w takim przypadku błąd nie wystąpi i zostanie wykonany zawarty w niej kod. Przyjmuje ona dwa parametry: nazwę wywołanej metody oraz tablicę zawierającą przekazane zmienne. Przykładowe zastosowanie może być nastepujące:


class MyClass
{
   public function __call($name, $params)
   {
      echo "Metoda $name nie istnieje. Przekazane parametry:";
      print_r($params);
   }
}

$object = new MyClass();
$object->undefinedMethod(12, "a", "b");

Wynik działania powyższego skryptu będzie następujący:


Metoda undefinedMethod nie istnieje. Przekazane parametry:

Array
(
   [0] => 12
   [1] => a
   [2] => b
}

Ciąg dalszy nastąpi…

Dodaj komentarz