Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wywołanie destruktora
Neotion
post 16.01.2006, 21:34:46
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 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?


--------------------
current: nexcite cms (0.2.5) running on top of netsource framework (0.5.3)

workbench: nsapi | php 5.1.2 | mysql 5.0.18 | phpmyadmin 2.9 rc1 | zend studio 5.2.0 | apache/2.2.0 (linux/suse)
Go to the top of the page
+Quote Post
DeyV
post 16.01.2006, 21:42:57
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.


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
Neotion
post 16.01.2006, 21:47:13
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


--------------------
current: nexcite cms (0.2.5) running on top of netsource framework (0.5.3)

workbench: nsapi | php 5.1.2 | mysql 5.0.18 | phpmyadmin 2.9 rc1 | zend studio 5.2.0 | apache/2.2.0 (linux/suse)
Go to the top of the page
+Quote Post
DeyV
post 17.01.2006, 09:15:49
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.


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
Ociu
post 17.01.2006, 14:25:02
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 17.01.2006, 15:24:04
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 ?smile.gif
Go to the top of the page
+Quote Post
dr_bonzo
post 18.01.2006, 11:15:12
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.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Neotion
post 21.01.2006, 17:58:29
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óż...


--------------------
current: nexcite cms (0.2.5) running on top of netsource framework (0.5.3)

workbench: nsapi | php 5.1.2 | mysql 5.0.18 | phpmyadmin 2.9 rc1 | zend studio 5.2.0 | apache/2.2.0 (linux/suse)
Go to the top of the page
+Quote Post
hwao
post 21.01.2006, 20:17:12
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
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 23.06.2025 - 07:28