Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wywołanie destruktora
Forum PHP.pl > Forum > PHP > Object-oriented programming
Neotion
Dawno nic nie pisałem, miałem uraz ale mam nadzieję że mi pomożecie 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?
DeyV
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.
Neotion
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.
DeyV
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.
Ociu
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
ActivePlayer
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 ?smile.gif
dr_bonzo
Klasy z destruktorami a posiadanie instancji tych klas, ktore sa usuwane na koncu dzialania skryptu to dwie rozne rzeczy.
Neotion
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óż...
hwao
czesc instacji klas moze zostac usunieta po wyslaniu juz odpowiedzi do przegladarki, sprawdz to operujac np na plikach.
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.