scanner
3.11.2003, 22:11:36
[php:1:5ebf0e21dd]<?php
public function __destruct()
{
unset( $this );
}
?>[/php:1:5ebf0e21dd]
Pytania:
1. Czy to wystarczy, aby zniszczyć obiekt? (Na logikę tak, ale... )
2. Kiedy wywoływane są destruktory?
3. Czy trzeba to robić ręcznie?
Destruktor jest wywolywany wtedy gdy robisz:
[php:1:082ed2efc0]unset( $obiekt );[/php:1:082ed2efc0]
I jest on potrzebny np. do tego aby zapisac ostatnie dane czy tez zniszczyc cos. Poprzez unset odrazu niszczony jest obiekt, wiec nie trzeba tego robic w destruktorze.
rzseattle
3.11.2003, 22:20:31
hmm a nie jest tez tak pzypadkiem ze jezeli recznie nie zniszczymy obiektu to destruktor jest wywolywany po zakonczeniu naszego skryptu??
scanner
3.11.2003, 22:23:26
OK. Znowu wiem więcej
rzseattle - dokładnie tak. Czyli przy kazdy niszczeniu obiektu - nie ważne czy wywołanym przez użytkownika czy przez proces php.
kurtz
4.11.2003, 09:11:31
Hej
Cytat
hmm a nie jest tez tak pzypadkiem ze jezeli recznie nie zniszczymy obiektu to destruktor jest wywolywany po zakonczeniu naszego skryptu??
Tak, to prawda. php skonstruowane jest tak by sprzatalo po sobie. Obiekty sa niczszczone a polaczenia do bazy automatycznei zamykane (dlatego m.in. nie trzeba ich zamykac). Destruktury moga sie przydac jesli np operujemy na pamieci dzielonej.
Pozdrawiam
slash.
4.11.2003, 10:50:35
a wiec o ile sie nie myle tworzac desktruktora mozemy wywolac metody odpowiedzialen za zapisanie stanu sesji, tak aby po przejscu na nastepna strone moc ta sesje odtworzyc, podobnie jak przy uzyciu serialize() i unserialize() - z ta roznica iz te funkcje przydaja sie przy przenoszeniu obiektow lub tablic itp, elementow. Czyli mozemy uzyc destruktora do zapisania stanu sesji a konstruktora do odtworzenia tejze sesji - dobrze rozumiem
LukaszLenart
8.11.2004, 14:18:14
Cytat(scanner @ 2003-11-03 23:11:36)
2. Kiedy wywoływane są destruktory?
Kiedy zmienna wychodzi poza zakres, tzn. jesli zadeklarujesz zmienna obiektowa w funkcji to jest ona niszczona po wyjsciu z tej funkcji.
hawk
18.11.2004, 22:18:17
@slash: Tak naprawdę nie możesz. Przecież serialize() wywołuje __sleep(), więc wywoływałbyś metody obiektu po odpaleniu destruktora!
Poza tym, jeżeli nie niszczysz obiektu ręcznie (przez unset), to nie ma już żadnej sesji. A w sumie w języku z garbage collectorem nie masz żadnej gwarancji, kiedy zostanie wywołany destruktor. Java też ma finalize, co nie znaczy że warto to stosować.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.