Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Destruktor traci bibliotekę
Marcstee
post
Post #1





Grupa: Nieautoryzowani
Postów: 42
Pomógł: 0
Dołączył: 15.12.2009

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


Witam.

Mam pewien problem z destruktorem. Problem wygląda następująco:

Wywołuje się front_controller i w nim są ładowane klasy z biblioteki. Potem akcja rozgrywa się w modelu. Tam wszystko pięknie działa wszystkie klasy są dostępne. Potem tworzę w nim nowy obiekt klasy X. wywołuję funkcję publiczną tego obiektu i kończę akcje. W destruktorze klasy X jest wykonywana pewna funkcja która wymaga innych klas z biblioteki. Jednak destruktor ten już ich nie widzi. Metoda wywoływana na tym obiekcie może być nawet pusta a i tak straci się biblioteka (ale tylko w obrębie tej klasy). Gdy po prostu stworze obiekt klasy X i nie wywołam na nim żadnej metody to w destruktorze dalej dostępne są klasy z biblioteki.

Na prawdę nie wiem jaki może być tego powód. Bardzo proszę o jakieś porady.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Marcstee
post
Post #2





Grupa: Nieautoryzowani
Postów: 42
Pomógł: 0
Dołączył: 15.12.2009

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


Hmmm ciekawy temat powiem. Zrobilem kilka testów i oto wyniki:
  1. <?php
  2. class Foo
  3. {
  4. public $var = 'xxsdcadscadscasdcsdcasdcasx';
  5.  
  6. public function foo_function(){}
  7. }
  8.  
  9.  
  10. $foo = new Foo();
  11. $foo->foo_function();
  12.  
  13. unset ($foo);
  14.  
  15. ?>


gdy odpalimy ten plik wynik będzie (u mnie) taki:
  1. 87048
  2. 87368
  3. 87136


gdy jednak zakomentujemy $foo->foo_function();
to wynik już będzie taki:
  1. 86784
  2. 87016
  3. 86784


Ciekawe jest to, że w 1 wypadku pamieć jak widać nie do końca została zwolniona. Test wykonany w PHP 5.2.11. Wersja 5.3.0 już zwalnia całkowicie pamięć.

Natomiast co do omawianego problemu to nie znalazłem jednoznacznej odpowiedzi, jednak wydaje mi się ( w oparciu o to co przeczytałem), że jest to spowodowane tym, że jak obiekt jest stworzony ale nie używany w żaden sposób to jest on szybciej likwidowany. Gdy jednak coś z nim robimy PHP czeka do samego końca bo może jeszcze coś z nim się stać i dlatego był kasowany później co powodowało te problemy.
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: 5.10.2025 - 05:09