Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Poważny problem z destruktorem
Forum PHP.pl > Forum > PHP > Object-oriented programming
DavidPL
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. ?>
mike
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. ?>
DavidPL
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.
dr_bonzo
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..
DavidPL
Ups...
Moja wina, moja wina, moja bardzo wielka wina...
Biję się w pierś.
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.