@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).
<?php interface Initializable { public function initialize(Context $context); } class System implements Initializable { protected $context; public function initialize(Context $context) { $this->context = $context; } } ?>
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.
<?php // sorry, że Zenda za przykład daję, ale zauważyłem, że wszyscy za ZF szaleją ostatnio. class News extends Zend_Db_Table implements Initializable { protected $context; public function initialize(Context $context) { $this->context = $context; } // a dalej ustawiasz model } // i dalej gdzieś w jakiejś np. akcji, gdy pobierasz model... $news = $context->getModel('News'); // a nawet (preferuje, ale zależy, czy masz generator kontekstu :)) $news = $context->getNewsModel('News'); // ... metoda Context::getModel(); rozpozna czy ładowany model można zainicjalizować (sprawdzi, czy implementuje Initializable), czy nie. ?>
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