Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wywołanie destruktora
Neotion
post
Post #1





Grupa: Zarejestrowani
Postów: 67
Pomógł: 0
Dołączył: 13.09.2004

Ostrzeżenie: (0%)
-----


Dawno nic nie pisałem, miałem uraz ale mam nadzieję że mi pomożecie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Skrypt kończy swoje działanie (jestem pewien co do wykonania ostatniej linijki, dałem tam sobie echo END) i po tym nie ma już nic, podczas gdy jakby po zakończeniu tego wszytskiego jest wywoływany destruktor klasy config (wyala mi komunika o błędzie którego nie ma). Nie innej tyko tej właśnie choć są wywołane instancje innych klas.

Dzieje się to w wielu wersjach PHP5.

Ma ktoś może pojęcie co się dzieje?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
DeyV
post
Post #2





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




destruktor uruchamiany jest w momencie niszczenia obiektu (czyli usuwania go z pamieci) Dzeje się tak w przypadku wykorzystania unset( zmienna )

Jeśli jednak nie wywołasz unset na wszystkich wykorzystywanych obiektach, to zostanie on "zniszczony" już po zakończeniu działania skryptu.

Co ciekawe - destruktory w php5.0 uruchamiane są naprawdę na samym końcu. Nawet po zamknięciu mechanizmów odpowiedzialnych za sesje.
W PHP5.1 dokonywano tu jakichś zmian, i nie wiem, jak to teraz wygląda.
Go to the top of the page
+Quote Post
Neotion
post
Post #3





Grupa: Zarejestrowani
Postów: 67
Pomógł: 0
Dołączył: 13.09.2004

Ostrzeżenie: (0%)
-----


Ale dalej nie rozumiem dlaczego uruchomił się tylko ten destruktor. Mam również inne klasy z destruktorami i żaden z nich się ni wywołuje.

Teraz postaje usunięcie destruktorów albo dodanie zmiennej $scriptEnded = true;

Mam rację?

A w php 5.1 miałem problem z autoloaderem i dlatego przesiadłem się na wersje wcześniejsze.

Ten post edytował Neotion 16.01.2006, 21:49:02
Go to the top of the page
+Quote Post
DeyV
post
Post #4





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




Jeśli nie chcesz mieć wywołanych destruktorów automagicznie, to po prostu zrezygnuj z tej nazwy metody.

A co do PHP5.1 - pracuję na nim od czasów pierwszych bet i jestem bardzo zadowolony.
Go to the top of the page
+Quote Post
Ociu
post
Post #5





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




Prościej mówiąc, deskrutkor do metoda, która jest automatycznie wywoływana jako ostatnia.

dajmy na to:

  1. <?php
  2. class test {
  3. public function __construct() {
  4. print 'konstruktor<br />';
  5. }
  6. public function show() {
  7. print 'show<br />';
  8. }
  9.  
  10. public function __destruct() {
  11. print 'destruct<br />';
  12. }
  13. }
  14.  
  15. $test = new test();
  16. $test->show();
  17. ?>


cow zróci:
Kod
konstruktor
show
destruct

pozdrawiam
Go to the top of the page
+Quote Post
ActivePlayer
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

Ostrzeżenie: (0%)
-----


Cytat
Ale dalej nie rozumiem dlaczego uruchomił się tylko ten destruktor. Mam również inne klasy z destruktorami i żaden z nich się ni wywołuje.
A moze sie wywołują tylko nie zwracają błędów zadnych i dlatego o tym nie wiesz ?(IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #7





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


Klasy z destruktorami a posiadanie instancji tych klas, ktore sa usuwane na koncu dzialania skryptu to dwie rozne rzeczy.
Go to the top of the page
+Quote Post
Neotion
post
Post #8





Grupa: Zarejestrowani
Postów: 67
Pomógł: 0
Dołączył: 13.09.2004

Ostrzeżenie: (0%)
-----


Ok, uznaje to za pewen bug w php 5.0 i w php 5.1 z tym problemu nie ma.

Innych destruktorów nie wywołało bo w destruktorze config bylo die(err);
Mój błąd.

Prosty sposób na poradznie sobie z tym:

Na końcu skryptu:
  1. <?php
  2.  
  3. $__scriptEnded = true;
  4.  
  5. ?>


I w każdym destruktorze
  1. <?php
  2.  
  3. function __destruct(){
  4. if($GLOBALS['__scriptEnded'])
  5.  return 0; //albo po prostu die(); będzie szybciej działało
  6. //...
  7. //Cała reszta
  8. //...
  9. }
  10.  
  11. ?>


Wiem że to trosze nieprofesjonalne ale cóż...
Go to the top of the page
+Quote Post
hwao
post
Post #9


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




czesc instacji klas moze zostac usunieta po wyslaniu juz odpowiedzi do przegladarki, sprawdz to operujac np na plikach.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.12.2025 - 08:43