23 maja 2017 3min.
Magiczne metody PHP
Magiczne metody w PHP’ie, to metody z zarezerwowanym prefiksem w postaci podwójnego podkreślenia „__”. Funkcje te nie są bezpośrednio używane przez programistę, lecz są one automatycznie wywoływane przez interpreter w odpowiedzi na poszczególne zachowania danej klasy, dlatego są nazwane ‘magicznymi’.
__construct()
Funkcja odpala się w momencie utworzenia obiektu, wykorzystujemy ją do przygotowania wszystkich potrzebnych danych dla klasy przed rozpoczęciem pracy.
{
echo ‘Wywołano konstruktor’;
}
__destruct()
Destruktor jak wskazuje nazwa, wywoływany jest na zakończenie pracy danego obiektu przez garbage collector, zwalniając zajęte przez klasę zasoby. Możemy go wykorzystać np. do zamknięcia wcześniej otwartego pliku we wnętrzu klasy albo rozłączenie z bazą danych.
public function __destruct()
{
fclose($this->file);
}
__get()
Wywoływana jest, gdy próbujemy się dostać do własności lub zmiennej w klasie, która nie istnieje, lub nie mamy do niej dostępu. Przyjmuje jeden argument, który jest nazwą pola, do którego próbujemy się odnieść.
public function __get($name)
{
echo ‘Pole ‘.$name.’ nie istnieje lub nie masz do niego dostępu’;
}
__set()
Funkcja wykonuje się, gdy próbujemy przypisać wartość do zmiennej, która nie istnieje lub nie mamy do niej dostępu. Przyjmuje 2 argumenty, pierwszy z nazwą pola, a drugi z wartością jaką próbowaliśmy przypisać.
public function __set($name, $value)
{
echo ‘Nie można przypisać wartości : ‘.$value.’ do pola ‘.$name;
}
__call()
Odpala się w momencie gdy próbujemy uzyskać dostęp do metody, która nie istnieje lub nie mamy do niej dostępu. Przyjmuje ona 2 argumenty, pierwszy z nazwą metody, do której chcieliśmy uzyskać dostęp, a drugi z parametrami przekazanymi do niej.
public function __call($name, $arguments)
{
echo ‘Wywołano funckję ‘.$name.’, z argumentami ‘.implode(', ', $arguments);
}
__callStatic()
Analogicznie do metody __*call() **do obsługi metod statycznych.
__isset()
Wywoływana jest, gdy użyjemy na polu obiektu, którego nie ma funkcji isset()
public function __isset($name)
{
echo ‘Wywołano isset dla pola ‘.$name;
}
__unset()
Funkcja odpala się gdy próbujemy użyć unset() na nieistniejącej własności danego obiektu.
public function __unset($name)
{
echo ‘Wywołano unset dla pola ‘.$name;
}
__sleep()
Funkcja **serialize() **sprawdza, czy w klasie istnieje metoda __sleep() i jeśli tak to wywołuje ją. Wykorzystywana jest gdy chcemy wybrać pola, które mają zostać zserializowane. Jako wynik tej funkcji zwracamy tablicę z nazwami pól które mają zostać zserializowane.
public function __sleep()
{
return array(‘name’);
}
Jako wynik serializacji klasy zawierającej tę metodę, zostanie zwrócone tylko pole z nazwą.
__wakeup()
Analogicznie, unserialize() sprawdza, czy istnieje funkcja o magicznej nazwie __wakeup(). Jeśli tak, funkcja może rekonstruować dowolne zasoby, które obiekt może posiadać.
_toString()
Funkcja zostanie wywołana w momencie, gdy będziemy chcieli użyć naszego obiektu jako stringa.
data-enlighter-theme="eclipse">public function __toString()
{
return $this->name;
}
__invoke()
Metoda zostanie odpalona, kiedy spróbujemy wywołać nasz obiekt jako funkcję.
public class Object
{
public function __invoke()
{
echo ‘Wykonano metode __invoke’;
}
}
$object = new Object();
$object();
_clone()
Metoda jest wykonywana w momencie, kiedy próbujemy sklonować obiekt za pomocą funkcji clone, możemy dzięki niej przygotować obiekt do sklonowania, którego wynikiem będzie identyczna kopia obiektu, jednak gdy chcemy stworzyć samodzielny obiekt, który ma zachować np. referencje do innych obiektów musimy ‘poprawić’ klonowanie.
class object
{
public $object1;
function __clone()
{
$this->object1 = clone $this->object1;
}
}