Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> dziwne zachowanie przy destruktorze, czyszczone są zmienne klasy typu static
motylo
post
Post #1





Grupa: Zarejestrowani
Postów: 35
Pomógł: 5
Dołączył: 13.07.2008
Skąd: Kalisz

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


Witam,
Na wstępie krótki opis. Nie chce korzystać z singletona do klas typu db, session, input etc. I prawdopodobnie tutaj znajduje się mój problem.
Mianowicie chodzi o klasę obsługi sesji, która wygląda mniej więcej tak (jest to szablon skrótowy - naprawdę ma połączenie z bazą danych i zapisuje dane do niej a nie do $_SESSION):
  1. class session{
  2.  
  3. static private $_instance = NULL;
  4. static private $_sessData = NULL; //dane sesji
  5. static private $_sessForm = NULL; //dane sesji do formularza (np. błąd, lub wypełnienie pola)
  6.  
  7. public function __construct(){
  8.  
  9. if( self::$_instance !== NULL ){
  10. return;
  11. }
  12.  
  13.  
  14. //pobranie danych z sesji
  15.  
  16. $_data = $_SESSION;
  17.  
  18. self::$_sessData = $_data['sessData'];
  19. self::$_sessForm = $_data['sessForm'];
  20.  
  21. //skasowanie $_SESSION - dostęp tylko przez obiejty klasy Session
  22.  
  23. $_SESSION = NULL;
  24.  
  25. //inne metody sprawdzajace poprawnosc danych, ilosc logowan, etc.
  26.  
  27. self::$_instance = $this;
  28. }
  29.  
  30. public function set($name, $value){
  31. //ustawianie self::$_sessData
  32. }
  33. //to samo przy setForm
  34. //jak również przy pobieraniu get($name)...
  35.  
  36. public function __destruct{
  37. // tak naprawdę zapis do bazy danych
  38. $_SESSION['sessData'] = self::$_sessData;
  39. $_SESSION['sessForm'] = self::$_sessForm;
  40. }


Nie przedstawiłem pozostałej części metod, gdyż nie mają wpływu na dalsze zachowanie. Jak już wspomniałem ma także połączenie z bazą
danych. Nie napisałem jeszcze o session_handler, który tam się znajduje, jednakże on służy do zapisu danych do bazy.

I tutaj pojawia się problem.

Przy pojedynczym wywołaniu obiektu i operacjach na nim wszystko gra, jednakże jeżeli wywołuję obiekt w różnych klasach pojawia się problem - dane są często nadpisywane lub kasowane przez domyślne.
Zastanawiam się dlaczego - operuje na danych typu static, czyli każdy obiekt powinien mieć do nich dostęp. Przez debugowanie zauważyłem że dane istnieją, jednakże pod samym końcem (wywoływanie ostatniego destruktora przez silnik PHP kasuje większość danych).

Czy ktokolwiek z Was miał już podobny problem?
Nadmieniam że jeżeli ustawię zapis sesji na native problem cały czas występuje.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Ja akurat rozumiem ideę destruktora aż za dobrze, bo siedziałem w C++ trochę dłużej i tam nieraz go definiowałem i w PHP także to robię. Najprościej mówiąc:
"Destruktor to metoda klasy wywoływana w momencie gdy obiekt klasy ma zostać usunięty z pamięci procesu - jawnie bądź nie."
Takie rozumienie pozwala zaważyć, że nie jest ważne jak obiekt ginie. Czy nakazujemy mu to w sposób jawny, w momencie uruchomienia garbage collectora czy też gdy skrypt się kończy to i tak tuż przed tym momentem jest on wywoływany. Polimorfizm w pewien sposób dla PHP jest bezsensowny, gdyż jego podstawowe działanie jest związane ze znajomością typu, a poza Object i Array trudno ustalić co tak naprawdę jest w zmiennej bo konwersja typów następuje w locie najczęściej i nie możemy na tym polegać tak jak w językach silnie stypizowanych.
Destruktora nie ma co ruszać jeśli nie działasz w konstruktorze w sposób mogący wpływać na stabilność lub inne instancje tej samej klasy. Najpowszechniejsze zastosowanie to użycie w momencie gdy przypisałeś obiektowi pamięć w konstruktorze w sposób niestandardowy lub oddziaływanie na wartości statyczne klasy. Chyba najprostszy przykład to licznik obiektów klasy. W konstruktorze go zwiększasz o 1, a w destruktorze zmniejszasz o 1. W ten sposób zawsze znasz dokładną ilość "żyjących" obiektów klasy w danej chwili.
Go to the top of the page
+Quote Post

Posty w temacie


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: 15.10.2025 - 10:24