Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Poważny problem z destruktorem, Błąd czy ja nie rozumię działania???
DavidPL
post
Post #1





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 27.04.2004
Skąd: Rzeszów

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


Witam,
Mam poważny problem ze znikającymi zmiennymi. Nie wiem czy jest to błąd php'a czy może ja źle rozumię działanie...
Może opiszę całą sytuację:

Staruję sesję.
Sprawdzam czy zmienna sesyjna jest ustawiona.
Jeśli jest ustawiona wypisuje ją.
Jesli nie jest ustawiona tworzę nowy obiekt.
Obiekt kończy swój zakres i wykonuje destruktor.
Destruktor zapisuje do zmiennej sesyjnej wartość.
Wartość jest w tej zmiennej zapisana - widać to - robione jest echo.
Skrypt kończy działanie.
Po ponownym uruchomieniu skryptu robiony jest start sesji i sprawdzanie zmiennej sesyjnej.
Została ona ustawiona w destruktorze więc powinna być dostępna, lecz... nie ma jej. Znikła...
Pytanie... Co się z nią stało? Była poza zakresem destruktora (zmienna globalna) więc nie powinna zostać zniszczona, natomiast wygląda na to że tak się stało.

  1. <?php
  2. // What is happened with session variable?questionmark.gif
  3. // I set it, but where it is?
  4.  
  5.  
  6. if (isset($_SESSION['var']))
  7. echo 'Reading session var: '.$_SESSION['var'];
  8. else
  9. $object = new Clas();
  10.  
  11.  
  12. class Clas
  13. {
  14. function __destruct()
  15. {
  16. $_SESSION['var'] = 'value';
  17. echo 'Setting session var: '.$_SESSION['var'];
  18. }
  19. }
  20. ?>


--------------------
Pozdrawiam,
Dawid
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
mike
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Cytat(DavidPL @ 2005-03-14 09:52:40)
Obiekt kończy swój zakres i wykonuje destruktor.

Co przez to rozumiesz?

A poza tym obiekt nie wywołuje automatycznie swojego destruktora. Wywołany on zostanie w chwili niszczenia obiektu, np w chwili wykonania :
  1. <?php
  2. $objObject = new Class();
  3. //...
  4. unset( $objObject ); // <- tu wykona się destruktor klasy Class dla obiektu $objObject
  5. ?>
Go to the top of the page
+Quote Post
DavidPL
post
Post #3





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 27.04.2004
Skąd: Rzeszów

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


Jak najbardziej... Zauważ że w momęcie kończenia działania skryptu obiekt też jest niszczony więc destruktor się wykonuje, sesja jest ustawiana więc przy kolejnym uruchomieniu skryptu powinna być dostępna.


--------------------
Pozdrawiam,
Dawid
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #4





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

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


Byc moze sesja jest zapisywana PRZED likwidacja obiektu -> przed uruchomieniem destruktora, wiec ta zmienna nie zostanie juz zapisana.
Sprobuj dodac unset() na koniec skryptu -- zeby wymusic usuniecie obiektu przed zakonczeniem skryptu..


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
DeyV
post
Post #5





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




http://forum.php.pl/index.php?showtopic=22168


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
DavidPL
post
Post #6





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 27.04.2004
Skąd: Rzeszów

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


Ups...
Moja wina, moja wina, moja bardzo wielka wina...
Biję się w pierś.


--------------------
Pozdrawiam,
Dawid
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 Aktualny czas: 19.08.2025 - 19:26