Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> __destruct, zasada dzialania...
goffyy
post
Post #1





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 8.02.2005

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


Mam troche moze glupie pytanie ale nie dziala mi jedna rzecz i zastanawiam sie dlaczego.

Mam klase w ktorej jest zdefiniowana funkcja __destruct(). Niestety podczas konczenia wykonywania sie skryptow funkcja ta nie zostaje wywolana pomimo ze klasa o ktorej mowa zostala wykorzystana. Mam wiec pytanie czy dziala to na wszystkich wersjach php5 (o ile mi wiadomo to tak) i czy przy konczeniu programu wywoluje sie ta procedura automatyczna czy trzeba zrobic przykladowo unset($jakasklasa) - co tez u mnie nie dziala (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)

Z gory dzieki za podpowiedz.
Go to the top of the page
+Quote Post
nasty
post
Post #2





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


tak dziala na wszystkich php5, podaj moze kod ?
Go to the top of the page
+Quote Post
goffyy
post
Post #3





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 8.02.2005

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


Kod jest banalny:

  1. <?php
  2. function __destruct() {
  3. if ($this->dirty) $this->save();
  4. }
  5. ?>


Kod jest o tyle prosty ze ma wywolac funkcje save() ktora ma byc uzywana do zapisywania ustawien aplikacji - jest to prosty wzorzec Registry. Z gory mowie ze funkcja save() wywolywana oddzielnie dziala poprawnie. Niestety __destruct nie uruchamia sie automatycznie. Pozostale funkcje typu __construct(), __autoload() itp dzialaja poprawnie.
Go to the top of the page
+Quote Post
nasty
post
Post #4





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


a napisz echo $this->dirty...
boc cos mi tu smierdzi falsem w $this->dirty (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
goffyy
post
Post #5





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 8.02.2005

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


Probowalem ale nawet jak dasz jakies echo na poczatku to i tak sie nie wyswietla. Poprostu dziala tak jakby pomijal _destruct() i zastanawia mnie dlaczego (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
nasty
post
Post #6





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


nic nie wyswietla, bo nic niema w tej zmiennej, w destrukt, zrob $this->dirty = true a zobaczysz ze bedzie dzialac, ale to tylko zeby ci pokazac ze dziala destruktor, podaj mi caly kod to ci powiem co jest nie tak.

Ten post edytował nasty_psycho 24.08.2006, 16:50:14
Go to the top of the page
+Quote Post
goffyy
post
Post #7





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 8.02.2005

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


Caly kod klasy:

  1. <?php
  2. class kernel_ApplicationRegistry extends kernel_Registry {
  3. private static $instance;
  4. private $freezefile = "temp/ApplicationRegistry.txt";
  5. private $values = array();
  6. private $dirty = false;
  7.  
  8. private function __construct() {
  9. $this->doReload($this);
  10. }
  11.  
  12. static function instance() {
  13. if (!self::$instance) self::$instance = new self(); 
  14. return self::$instance;
  15. }
  16.  
  17. static function reload() {
  18. self::instance()->doReload();
  19. }
  20.  
  21. private function doReload() {
  22. if (!file_exists($this->freezefile)) return false;
  23. $serialized = file_get_contents($this->freezefile, true);
  24. $array = unserialize($serialized);
  25. if (is_array($array)) {
  26. $array = array_merge($array, $this->values);
  27. $this->values = $array;
  28. return true;
  29. }
  30. return false;
  31. }
  32.  
  33. private function save() {
  34. echo "save";
  35. $frozen = serialize($this->values);
  36. try {
  37. file_put_contents($this->freezefile, $frozen, FILE_USE_INCLUDE_PATH);
  38. } catch (KernelException $e) {
  39. $e->__toString();
  40. }
  41. $this->dirty = false;
  42. }
  43.  
  44. function get($key) {
  45. return $this->values[$key];
  46. }
  47.  
  48. function set($key, $val) {
  49. echo "ustawiam";
  50. $this->dirty = true;
  51. $this->values[$key] = $val;
  52. }
  53.  
  54. function isEmpty() {
  55. return empty(self::instance()->values);
  56. }
  57.  
  58. function __destruct() {
  59. echo "wychodze";
  60. if ($this->dirty) $this->save();
  61. }
  62. }
  63. ?>


Jak cos znajdziesz to daj znac (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
nasty
post
Post #8





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


no pewnie ze nic nie zrobi bo nigdze nie przydzielasz jej innej wartosci niz false na poczadku, daj np, w __construct $this->dirty = true, i wykonaj, ale wydac ze zapomniales ustalic w jakiejkowiek funkcji zeby zmieniala $this->dirty na true
Go to the top of the page
+Quote Post
goffyy
post
Post #9





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 8.02.2005

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


Jest ustalana na true tutaj:

  1. <?php
  2. function set($key, $val) {
  3. echo "ustawiam";
  4. $this->dirty = true;
  5. $this->values[$key] = $val;
  6. }
  7. ?>


Czyli w momencie jak ustawiasz jakas nowa zmienna lub jak zmianiasz istniejaca.
Go to the top of the page
+Quote Post
nasty
post
Post #10





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


jesli ta funkcje wywolujesz, to powinno dzialac, jak nie to ja juz nieiwm (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
goffyy
post
Post #11





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 8.02.2005

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


ja tez nie wiem wlasnie (IMG:http://forum.php.pl/style_emoticons/default/sad.gif) musze do admina napisac bo wyglada ze cos nie tak maja z php (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
nasty
post
Post #12





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


admin tu ci nic nie pomoze, nie zawracaj mu glowy (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Ten post edytował nasty_psycho 24.08.2006, 17:14:50
Go to the top of the page
+Quote Post
hwao
post
Post #13


Developer


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




a ja wiem (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Dekstruktor jest generalnie zawsze wykonywany, ale jest z nim sporo problemow...

http://www.zyxist.com/pokaz.php/glupi_blad_php
O tu. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Zeby sprawdzic czy sie wlacza zrob po prostu

  1. <?php
  2. function __destruct() {
  3. // echo nie bedzie widac, poniewaz dekstuktor
  4. // zazwyczaj jest odpalany po skonczeniu przesylania danych do klienta http (czyli nie widzi juz tego)
  5. echo "wychodze";
  6. // Zdebugujemy to tak
  7.  
  8.  
  9. [b]file_put_contents( './test.txt', 'Desktruktor, uruchomiony'.date('d.m.Y h:i:s' ) );
  10. [/b]
  11. if ($this->dirty) $this->save();
  12. }
  13. ?>
Go to the top of the page
+Quote Post
goffyy
post
Post #14





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 8.02.2005

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


Masz racje (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Tylko ze u mnie nie dizala na razie w zaden sposob (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
mariuszn3
post
Post #15





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

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


goffyy destruktor zawsze jest odpalany i nie jest to żadne widzimisie..
Przetestowałem Twój kod i zawsze wyświetla mi 'wychodzę' więc wszystko jest ok..
Sprawdź czy jakieś inne czynniki nie wpływają na to, że tego nie widzisz.
Jest tylko jedyna mi znana możliwość aby destruktor nie był odpalony.
Tak będzie jeśli przy wyjściu aplikacji wystąpił błąd 'fatal error' podczas wywołania destruktora jednego z obiektów, wtedy żadne inne destruktory jeszcze istniejących obiektów już nie zostaną odpalone.
Go to the top of the page
+Quote Post
goffyy
post
Post #16





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 8.02.2005

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


teoretycznie to i ja wiem ze tak powinno byc gorzej ze na tym serwerze co testuje nie jest (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
splatch
post
Post #17





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

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


Może to głupie pytanie.. ale masz jakąś instancje tej klasy [stworzony obiekt]?
Go to the top of the page
+Quote Post
nasty
post
Post #18





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


a wez w construct napisz :
  1. <?php
  2. $this->__destruct();
  3. ?>

i zobacz czy wykona ..., bo jak nie to ....
Go to the top of the page
+Quote Post
goffyy
post
Post #19





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 8.02.2005

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


W ten sposob dziala wszystko poprawnie a wiec to wina php jakas (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #20





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Możesz pokazac klasę bazową?
Go to the top of the page
+Quote Post
goffyy
post
Post #21





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 8.02.2005

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


To jest prosta klasa abstrakcyjna:

  1. <?php
  2. abstract class kernel_Registry {
  3. private function _construct() {}
  4. abstract function get($key);
  5. abstract function set($key, $val);
  6. }
  7. ?>
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #22





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Hmm... jakbym nie kombinował i tak zawsze jest ok. Coś musiałes gdzieś namieszać w kodzie użytkującym klasę. Wygląda na to, że coś przestawia Ci zmienną $dirty na false. Upewnij się, że tak się nie dzieje.

Tak na marginesie - możesz smiało wywalić konstruktor z klasy bazowej - nie jest potrzebny (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Pozdrawiam.
Go to the top of the page
+Quote Post
goffyy
post
Post #23





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 8.02.2005

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


Niestety to jednak php bo ja tylko ta klase do pliku wrzuclem i nie dziala (IMG:http://forum.php.pl/style_emoticons/default/sad.gif) A co do konstruktora to masz racje.
Go to the top of the page
+Quote Post
drizzt73
post
Post #24





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 29.08.2006

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


ja mialem takie jaja z destruktorami kiedy wewnatrz destruktora jednej klasy odwolywalem sie do innej - ktora chyba niedoskonaly jeszcze w tym wzgledzie php pozwolil sobie juz zniszczyc. Pod www nie bylo tego w ogole widac, w shellu dopiero jak zaczalem sprawdzac to pojawil sie nawet segmentation fault. Dlatego popatrz jeszcze w miejsce gdzie ew. tak klasa moze sie niszczyc o ile nie jest to "naturalny" koniec.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 8.10.2025 - 04:39