Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Kolejność likwidowania obiektów
Forum PHP.pl > Forum > Przedszkole
ayeo
Witam!
W jakiej kolejności likwidowane są obiekty przy kończeniu skryptu i czy da się to kontolować? Chodzi np o problem z klasą sesji. Mianowicie w destruktorze tej klasy nie powinno (nie można) korzystać z obiektów bo są one już zlikwidowane wcześniej niż sesja. Co jeśli destruktor korzysta z klasy bazy danych? Klasa BD jest w sumie Singletonem więc jak co to postawi mi tą klasę od nowa, ale to niepotrzebny narzut. Mogę też dać w destruktorze session_write_close() i poprostu usuwać obiekt Session na końcu każdego skryptu, ale to też mi sie nie podoba. Dziękuję z góry za wszytskie wzkazówki winksmiley.jpg
nevt
jeżeli masz z tym problem, to znaczy że źle zaprojektowałeś swoje klasy. jedną z podstawowych reguł programowania obiektowego jest hermetyczność klas - to znaczy, że kod danej klasy nie powinien zależeć od kodu innych klas (o ile nie jest ich implementacją lub rozszerzeniem)
Cytat
Co jeśli destruktor korzysta z klasy bazy danych
to oznacza, że twoja klasa sesji musi posiadać właściwość typu klasy bazy danych - wtedy masz gwarancję, że będzie dostępna zawsze dla wszystkich metod, łacznie z destruktorem. jeżeli z wnętrza swojej klasy sesji potrzebujesz odwoływać się do innych, niezależnych obiektów (tutaj bazy danych), to znaczy że właśnie zapomniałeś o regule hermetyczności.
ayeo
Dziekuję za odpowiedź! Sporo mi się wyjaśniło w głowie dzieki Tobie winksmiley.jpg Mam teraz takie pytanie kontrolne, żeby się upewnić czy wszystko dobrze rozumiem. Klasa Session musi korzystać z klasy DataBase! Więc powinienem dodać do klasy Session właściwość $DB = DataBase::getInstance(); tak? Czy to jest zgodne z zasadą hermetyzacji?
nevt
dokładnie - i wtedy masz gwarancję dostępu do bazy przez cały czas życia obiektu sesji.
generalna zasada programowania obiektowego: obiekt składa się z danych (właściwości) i funkcji operujących na tych danych (metod). jeżeli metoda obiektu powinna operować na danych zewnętrznych, to te dane (albo obiekty) należy do niej jawnie przekazywać. np.
  1. <?php
  2. //mamy obiekt a klasy A
  3. $a = new A();
  4. //mamy obiekt b klasy B
  5.  $b = new B();
  6. //i w metodzie 'ustaw' obiektu b potrzebujemy dostać się do obiektu a, to przekazujemu go jawnie:
  7. $b->ustaw($a);
  8. ?>

powodzenia.
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.