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

Usunięta treść Dodana treść
kon
Nie podano opisu zmian
 
Linia 9:
Konstruktor jest metodą o nazwie <code>__construct()</code>, która może pobierać parametry, lecz nie wolno jej zwracać wartości. Jej zadaniem jest wykonanie pewnych akcji tuż po utworzeniu obiektu tak, aby można było od razu zacząć z nim pracę. Spójrzmy na nasz przykład z osobami, który analizowaliśmy ostatnio. Tuż po utworzeniu pola <code>$_name</code> oraz <code>$_surname</code> miały wartość pustą i należało ręcznie przypisać im wartość, a do tego czasu obiekt '''Person''' znajdował się w stanie, który możemy uznać za błędny. Może się zdarzyć, że wskutek pomyłki ktoś zapomni zainicjować odpowiednio obiekt po utworzeniu i przekaże go do dalszego przetwarzania. Gdy błąd się ujawni, moglibyśmy stracić dużo czasu na znalezienie błędu, a nawet potencjalnie zagrozić bezpieczeństwu aplikacji. Dzięki konstruktorom mamy pewność, że nasz obiekt zawsze będzie poprawnie inicjowany. W naszym przypadku chcemy, aby tworzona osoba od razu posiadała imię i nazwisko.
 
<sourcesyntaxhighlight lang="php" line><?php
class Person
{
Linia 36:
} // end getFullName();
} // end Person;
</syntaxhighlight>
</source>
 
Settery są już nam niepotrzebne. Jak pamiętamy, mogły być one wywołane tylko raz, a skoro teraz imię i nazwisko jest przypisywane przez konstruktor, nie trzeba dodatkowych metod, które i tak nie zadziałają.
Linia 42:
Popatrzmy teraz, jak przekazywać argumenty do konstruktora. Robimy to tuż po nazwie klasy przy operatorze '''new'''. Gdy klasa nie posiada konstruktora lub konstruktor nie pobiera argumentów, nawiasy wyjątkowo można w tym wypadku pominąć tak, jak to dotąd robiliśmy. Jednak po dokonanych zmianach musimy już napisać:
 
<sourcesyntaxhighlight lang="php" line>$janusz = new Person('Janusz', 'Kowalski');
</syntaxhighlight>
</source>
 
{{Uwaga|W PHP4 metoda konstruktora musiała nazywać się identycznie, jak klasa, tj. jeśli mieliśmy klasę ''Person'', jej konstruktorem była metoda o nazwie ''Person''. Dla zachowania kompatybilności, PHP5 wciąż akceptuje takie konstruktory, lecz dopiero w drugiej kolejności. Wsparcie dla nich zostanie usunięte w PHP6.}}
Linia 54:
Podobnie jak w większości dynamicznych języków, obiekt przestaje istnieć w momencie usunięcia wszystkich prowadzących do niego referencji. W PHP mamy możliwość zaprogramowania operacji, która ma się wtedy wykonać, dzięki ''destruktorom''. Przykładowo, gdy nasz obiekt reprezentuje otwarty plik, w destruktorze możemy go automatycznie zamknąć. Destruktor jest metodą o nazwie <code>__destruct()</code>, która nie może ani pobierać żadnych argumentów, ani też zwracać wartości. Poniższy przykład ilustruje działanie destruktorów:
 
<sourcesyntaxhighlight lang="php" line><?php
 
class Destructable
Linia 74:
 
echo 'Kończymy pracę...<br/>';
</syntaxhighlight>
</source>
 
Wynikiem jego działania jest:
Linia 95:
Sprawdźmy działanie poniższego skryptu:
 
<sourcesyntaxhighlight lang="php" line><?php
 
class CircularReference
Linia 130:
 
echo 'Koniec pracy skryptu.<br/>';
</syntaxhighlight>
</source>
 
Gdy uruchomimy ten skrypt, jego wynikiem działania powinno być:
Linia 140:
Czyli mimo, iż nie mamy do obiektu dostępu, nie jest on niszczony natychmiast. W PHP 5.3 automatyczne wykrywanie cykli może być włączone w pliku <code>php.ini</code> lub poprzez wywołanie funkcji <code>gc_enable()</code>, lecz najprawdopodobniej także i wtedy nasze wyjście będzie wyglądało tak, jak powyżej. Odśmiecacz po prostu czeka, aż uzbiera się wystarczająca liczba referencji i dopiero wtedy przegląda pamięć w poszukiwaniu obiektów. Możemy to wymusić, przerabiając lekko nasz skrypt. Aby PHP nie zawalił nas komunikatami o niszczonych obiektach, dodajmy flagę sygnalizującą, czy obiekt ma nas informować o swoim zniszczeniu, a następnie utwórzmy dodatkową pętlę, która będzie w kółko tworzyć obiekty z cyklami:
 
<sourcesyntaxhighlight lang="php" line><?php
// Uwaga: tylko PHP 5.3.
 
Linia 190:
 
echo 'Koniec pracy skryptu.<br/>';
</syntaxhighlight>
</source>
 
Tym razem odśmiecacz pamięci zareagował, co poznajemy po zmienionym wyniku: