PHP/Konstruktory i destruktory: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
dodatkowy tekst...
Zyx (dyskusja | edycje)
wreszcie sensowny zalążek :)
Linia 1:
{{podświetl|php}}
<div class="noprint">{{prognav|PHP|Klasy i obiekty|Dziedziczenie}}</div>
<div class="noprint">{{poprawić|Rozdział w ogóle nie pasuje do podręcznika. Zostanie on przepisany, gdy autorzy dotrą do tego miejsca przy pisaniu. Poza tym, dotyczy PHP4 a od dawna mamy PHP5...}}</div>
 
== Konstruktory i destruktory ==
Skoro nauczyliśmy się tworzyć klasy i obiekty omówię czym są konstruktory i destruktory.
Metody klas nie muszą być wywoływane wyłącznie przez programistę tworzącego dany skrypt. Istnieje pewna grupa metod, które są wywoływane automatycznie przez interpreter w momencie zajścia jakiegoś zdarzenia - metody takie nazywamy ''magicznymi'', a w PHP możemy poznać je po tym, że ich nazwy rozpoczynają się od dwóch podkreśleń: '''__'''.
 
Pierwszymi magicznymi metodami, jakie poznamy, będą ''konstruktor'' i ''destruktor'', wywoływane odpowiednio w momencie tworzenia oraz niszczenia obiektu.
=Konstruktor=
 
== Konstruktor ==
Konstruktor jest jedną z funkcji "magicznych" w językach zorientowanych obiektowo. W PHP od wersji 5, konstruktor jest funkcją o nazwie ''__construct''. Tak zadeklarowana funkcja jest wywoływana automatycznie w momencie utworzenia instancji klasy. Konstruktor przechwytuje wszystkie parametry podane przy tworzeniu obiektu, może więc posłużyć do nadania wartości początkowych zmiennym będącym prywatnymi właściwościami obiektu:
Konstruktor jest metodą o nazwie '''__construct()''', która może pobierać parametry, lecz nie wolno jej zwracać wartości. Jej zadaniem jest zainicjowanie nowoutworzonego obiektu. Wracając do przykładu z klasami reprezentującymi osoby, można je przepisać następująco:
 
<nowiki><?php
 
class osoba
// deklaracja klasy
{
public class myClass {
private public $testimie;
public $nazwisko;
public function __construct ($val)imie, {$nazwisko)
$this->test = $val;
{
}
$this -> ustawPersonalia($imie, $nazwisko);
}
} // end __construct();
 
public function ustawPersonalia($imie, $nazwisko)
// utworzenie instancji klasy, wraz z przypisaniem wartości początkowej
{
$obj = new myClass ('ala');
$this ->test imie = $valimie;
$this -> nazwisko = $nazwisko;
} // end ustawPersonalia();
public function personalia()
{
return $this -> imie.' '.$this -> nazwisko;
} // end personalia();
}
$osoba = new osoba('Adam', 'Kowalski');
echo $osoba -> personalia();
?></nowiki>
 
Teraz personalia osoby możemy ustawić zarówno stosowną metodą, jak i w momencie tworzenia obiektu, ponieważ stworzyliśmy konstruktor, który pobiera imię i nazwisko i kieruje je do metody ''ustawPersonalia()''. Zauważmy, że w takim wypadku przekazujemy te parametry tuż przy nazwie klasy tak, jakby to była funkcja. Jeśli konstruktor nie pobiera żadnych parametrów, możemy (acz nie musimy) pominąć nawiasy:
?>
</nowiki>
Destruktor może posłużyć także np. do ładowania skina, języka, czy łączenia z bazą danych. Przykładowo możesz napisać klasę, która będzie przetwarzała pliki szablonu (skina) strony. I dać jej konstruktor który automatycznie wczytuje domyślny szablon, bez wyłowywania funkcjii.
 
<nowiki>// wywołanie konstruktora, który nie pobiera parametrów
=Destruktor=
$obiekt = new klasa;
$obiekt = new klasa();</nowiki>
 
{{Uwaga|W PHP4 metoda konstruktora musiała nazywać się identycznie, jak klasa, tj. jeśli mieliśmy klasę ''osoba'', jej konstruktorem była metoda o nazwie ''osoba''. Dla zachowania kompatybilności, PHP5 wciąż akceptuje takie konstruktory, lecz dopiero w drugiej kolejności, zaś zostanie to usunięte w PHP6.}}
Destruktor jest odwrotnością konstruktora. Wywołuje funkcję, przy wyłączaniu(zamrażaniu) klasy.
 
'''Ćwiczenie:''' W poprzednim rozdziale podaliśmy zbudowany na OOP system konfiguracji. Jedną z klas wchodzących do zestawu była ''fileResource''. Dodaj do niej konstruktor, który pobiera nazwę z plikiem konfiguracyjnym tak, aby można go było podać już w momencie tworzenia obiektu. Przerób kod korzystający z tego zestawu klas, aby korzystał z konstruktora.
 
== Destruktor ==
 
== Zakończenie ==