PHP/Metody magiczne: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Zyx (dyskusja | edycje)
m dodanie nawigacji + info, że rozdział jest do przepisania.
Zyx (dyskusja | edycje)
rozpoczęcie prac nad rozdziałem.
Linia 1:
<div class="noprint">{{prognaw|PHP|[[../Elementy statyczne|Elementy statyczne]]|[[../Iteratory|Iteratory]]}}</div>
 
== Metody magiczne ==
{{poprawić|Treść zupełnie odstaje od poziomu i zawartości reszty podręcznika. Do przepisania.}}
 
W każdej klasie możemy utworzyć szereg metod, które będą traktowane w specjalny sposób przez PHP. Zwyczajowo nazywa się je ''metodami magicznymi'', gdyż wywołuje je interpreter w odpowiedzi na różne zdarzenia, a nie programista. Można je poznać po tym, że ich nazwy zaczynają się od dwóch podkreśleń, co oznacza, że dwie takie metody powinniśmy już kojarzyć. Są to <code>__construct()</code> oraz <code>__destruct()</code> wywoływane automatycznie przy tworzeniu i niszczeniu obiektu. To jednak tylko czubek góry lodowej.
PHP 5 dodało nowe metody do klas. Metody __toString, __call, __get i __set są obecnie testowane, dają wiele możliwości, lecz jeszcze nie wiadomo czy tak naprawdę się przyjmą. Istotną zmianą jest również sposób przekazywania obiektów. Obecnie są one zawsze przekazywane przez [[referencja | referencję]]. Stąd wersje 4 i 5 nie są do końca kompatybilne.
 
=== Dostęp do pól obiektu ===
'''__toString()''' metoda bezparametrowa, bardzo przydatna, jeżeli chcemy mieć łatwy dostęp do danych zawartych w obiekcie.
<pre>
<?php
class TestToString
private $nazwa = "";
public function __construct($nazwa)
{
$this->nazwa = $nazwa;
}
public function __toString()
{
return $this->nazwa;
}
}
 
Gdy próbujemy odwołać się do nieistniejącego pola klasy, PHP zazwyczaj generuje komunikat '''E_NOTICE'''. Dzięki metodom <code>__get()</code> oraz <code>__set()</code> możemy zaprogramować własną akcję i wykorzystać to do swoich celów.
$obiekt = new TestToString("Obiekt nr 1");
 
echo $obiekt;
{{Definicja|Metoda <code>__get()</code> przyjmuje dokładnie jeden argument będący nazwą pola, które próbujemy odczytać i powinna zwrócić wartość, która będzie zaprezentowana użytkownikowi jako wartość tego pola.}}
 
{{Definicja|Metoda <code>__set()</code> przyjmuje dokładnie dwa argumenty: nazwę pola oraz wartość, którą użytkownik próbuje do niego przypisać.}}
 
Przyjrzyjmy się naszemu stale ulepszanemu systemowi konfiguracji. Odwoływanie się do opcji konfiguracyjnych przez <code>$config->get('nazwa')</code> jest odrobinę niewygodne. Dlatego zasymulujemy, że poszczególne opcje są dostępne jako pola klasy. Poniżej pokazany jest fragment klasy '''Config''' z nową metodą:
 
<source lang="php" line highlight="17"><?php
class Config implements Countable
private $nazwa_config = ""array();
private $_awaitingLoaders = array();
public function __construct__get($nazwaname)
{
return $this->nazwaget($name);
} // end count();
// pozostała część klasy
} // end Config;
 
$config = new Config;
?>
$config->addLoader(new FileConfigLoader('./config.ini.php'));
</pre>
echo $config->websiteTitle;
'''__construct()''' konstruktor, metoda wywoływana podczas tworzenia obiektu. Parametry podane w tej metodzie będą wymagane podczas tworzenia obiektu – (w PHP 3 i 4 konstruktorem była metoda nazywająca się tak samo jak nazwa klasy)
</source>
 
Metoda <code>__get</code> wywoływana jest w podświetlonej linijce, gdy próbujemy dostać się do nieistniejącego pola. PHP pobiera jej wynik i zwraca skryptowi jako jego wartość. Jednocześnie ponieważ nie chcemy, aby ktoś modyfikował konfigurację, nie udostępniamy metody <code>__set()</code> wywoływanej przy próbie przypisania nieistniejącemu polu jakiejś wartości.
'''__destruct()''' zdarzenie destruktora, to zdarzenie wykonuje się przed zniszczeniem obiektu
 
{{stub}}
'''__call()''' metoda dwuparametrowa, pierwszy parametr to nazwa metody a drugi to jej parametry, metoda wykonuje się w czasie, gdy operujemy na metodzie nieznajdującej się w obiekcie.
 
=== Wywoływanie metod ===
'''__get()''' metoda jednoparametrowa, jej parametr to nazwa pola, którego nie ma w obiekcie, a była próba odczytania jej wartości
 
=== Klonowanie obiektów ===
'''__set()''' metoda dwuparametrowa, gdzie pierwszy parametr to nazwa pola a drugi to wartość przypisana, metoda ta wykonywana jest w momencie, gdy chcemy przypisać wartość do pola, które nie zostało zawarte w obiekcie.
 
=== Serializacja obiektów ===
'''__clone()''' metoda wykonywana podczas klonowania obiektu (tzw. [[konstruktor kopiujący]]), daje nam możliwość zmodyfikowania sklonowanego obiektu, metodę warto użyć, jeżeli potrzebujemy kopii obiektu i w kopii od razu chcemy przeprowadzić jakąś niewielką zmianę.
 
=== Rozszerzony dostęp do pól obiektów ===
'''__unset()''' metoda uruchamiana podczas gdy używamy unset() na właściwości obiektu.
 
== Zakończenie ==
'''__isset()''' metoda uruchamiana podczas gdy używamy isset() na właściwości obiektu.