Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PDO i współpraca z własnymi klasami
Forum PHP.pl > Forum > PHP > Object-oriented programming
Stron: 1, 2
LBO
Cytat(Black-Berry @ 4.12.2008, 20:06:14 ) *
@markac Ja nie mam pojęcia o programowaniu obiektowym?? Skoro tak to ty nie umiesz czytać bo napisałem ze jesli ktoś chce sobie zautomatyzować to dziedziczy po Core_Object a nie po DB!! I DB i twój przykładowy kot może być obiektem dziedziczącym po Core_Object i nie mów mi że to nie logiczne bo kot jest zwierzęciem a nie obiektem jądra.


Może wyjaśnię.

Musisz na takie rzeczy patrzeć z punktu logiki biznesowej. Czyli umieć oddzielić te obiekty, które w niej udział biorą (twoje klasy z których tworzysz aplikację, a także zewnętrzne 3rd party) i inne (zasadniczo systemowe należące do Twojego frameworka. Tworzące z Nim jednolitą całość, ale niekoniecznie, bo tu też możesz użyć zewnętrznych klas i wtedy wpadają w pierwszy przypadek).

  1. <?php
  2. interface Initializable
  3. {
  4.    public function initialize(Context $context);
  5. }
  6.  
  7. class System implements Initializable
  8. {
  9.     protected $context;
  10.  
  11.     public function initialize(Context $context)
  12.    {
  13.        $this->context = $context;
  14.    }
  15. }
  16. ?>


Tutaj masz samo jąderko systemu i takie klasy jak LogManager, DatabaseManager mogą dziedziczyć po klasie System, ponieważ leżą w obrębie integralnych części frameworka., a ty zaoszczędzisz sobie deklarowania initialize().

I teraz fun part. Co jeżeli jako np. modelu chcesz użyć zewnętrznych narzędzi typu Doctrine lub Zend_Db? One nie mają wbudowanej obsługi inicjalizowania przez Twój system. Nie będziesz mógł dziedziczyć po klasie System, bo musisz dziedziczyć po klasach modelu. Co teraz?

Na pomoc przychodzą interfejsy.

  1. <?php
  2. // sorry, że Zenda za przykład daję, ale zauważyłem, że wszyscy za ZF szaleją ostatnio.
  3. class News extends Zend_Db_Table implements Initializable {
  4.     protected $context;
  5.  
  6.     public function initialize(Context $context)
  7.    {
  8.        $this->context = $context;
  9.    }
  10.  
  11.   // a dalej ustawiasz model
  12. }
  13.  
  14. // i dalej gdzieś w jakiejś np. akcji, gdy pobierasz model...
  15. $news = $context->getModel('News');
  16.  
  17. // a nawet (preferuje, ale zależy, czy masz generator kontekstu :))
  18. $news = $context->getNewsModel('News');
  19.  
  20. // ... metoda Context::getModel(); rozpozna czy ładowany model można zainicjalizować (sprawdzi, czy implementuje Initializable), czy nie.
  21. ?>


Rzecz jasna możesz wstrzyknąć jakiś InitializableZendDbTable pomiędzy Zend_Db_Table a ten model News, ale chciałem pokazać jak najprostszy przykład.

Pozdrawiam, Alan
Black-Berry
@LBO No tak, zgadzam się. Ja cały czas o czymś takim pisze. Chodzi mi oczywiście o 1 część twojego postu bo o problematyce części drugiej nie ma sensu wspominac tutaj. Zakładam bardzo "sterylny" przypadek w którym sam piszesz sobie wszystkie klasy i nie korzystasz z klas z innych systemów.
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.