Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Dziedziczenie obiektów? Z klasy "matki"
zielu001
post
Post #1





Grupa: Zarejestrowani
Postów: 87
Pomógł: 3
Dołączył: 15.08.2009

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


Witam, tworzę zalążek aplikacji, która będzie obsługiwać inne aplikacje.

Stanąłem nad jednym zagadnieniem, możliwe że moje ubytki wiedzy wiążą się z małym niedoinformowaniem.

Otóż. Tworzę sobie loader całej aplikacji.

Plik index.php wygląda miej więcej tak że wywołuje klasę EngineInit, a w niej funkcję EngineStart.

W klasie EngineInit, w func EngineStart ładuję odpowiednie klasy, które własnie tworzę.
Dopowiednio jest to obsługa sesji, obsługa debugowania aplikacji, obsługa aplikacji, obsługa baz danch i inne

Problem polega na tym że chcę kożystać z tych obiektów tak:

  1. class EngineInit
  2. {
  3. public function EngineStart()
  4. {
  5. // [...]
  6. // Ładowanie obiektów najbardziej potrzebnych
  7. $conf = new ConfigurationInit;
  8. $db = new DataBaseLoader;
  9. $session = new SessionsLoader;
  10. // [...]
  11. }// end EngineStart
  12.  
  13. }
  14.  




Problem polega na tym że chcę użyć np. obiektu $conf w $db lub w $session i np. $db w $session..
Global nie działa (IMG:style_emoticons/default/ohno-smiley.gif)
Ma ktoś pomysł jak to rozwiązać?

Proszę o naprowadzenie (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
mortus
post
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Koledze nie o to chodzi, czy i gdzie wykorzystać singleton. Jeśli nawet wykorzysta ten wzorzec, to nadal jego problem nie będzie rozwiązany.

@zielu001: Z Twojego opisu wynika, że klasa EngineInit jest niejako klasą główną, a metoda EngineStart ma zainicjować konfigurację, bazę danych i sesje, z których później będziesz korzystał. Jednak w kodzie, który nam pokazałeś tworzysz tylko zmienne lokalne, działające w obrębie metody EngineStart. Nie będziesz miał zatem możliwości posługiwania się nimi później. Dlatego klasa mogłaby/powinna wyglądać nieco inaczej:
  1. class EngineInit {
  2. private $_configuration = null;
  3. private $_database = null;
  4. private $_session = null;
  5. public function EngineStart() {
  6. $this->_configuration = new ConfigurationInit;
  7. $this->_database = new DataBaseLoader;
  8. $this->_session = new SessionsLoader;
  9. }
  10. }

Teraz przejdźmy do meritum. Jeśli obiekt klasy DatabaseLoader (i tutaj nieważne, czy jest to singleton, czy nie), czy też klasy SessionLoader musi skorzystać z danych zawartych w obiekcie klasy ConfigurationInit, to trzeba te informacje przekazać. Jak to zrobić? Otóż można posłużyć się "mechanizmem" DI (dependency injection, wstrzykiwanie zależności). Metoda EngineStart wyglądałaby zatem trochę inaczej:
  1. class EngineInit {
  2. // ...
  3. public function EngineStart() {
  4. $this->_configuration = new ConfigurationInit;
  5. $this->_database = new DataBaseLoader($this->_configuration);
  6. $this->_database = DataBaseLoader::getInstance($this->_configuration); // jeśli klasa DataBaseLoader będzie singletonem
  7. $this->_session = new SessionLoader($this->_configuration);
  8. }
  9. }

Teraz konstruktory klas DataBaseLoader i SessionLoader mogą skorzystać z informacji, jakie "posiada" obiekt klasy ConfigurationInit. Gwoli dopełnienia formalności uzupełnijmy dla przykładu klasę DataBaseLoader:
  1. // tutaj zwykła (nie będąca Singletonem) klasa DataBaseLoader
  2. class DataBaseLoader {
  3. // ...
  4. public function __construct($configuration) {
  5. $this->_connection = $this->connect($configuration->getDbHost(), $configuration->getDbUser(), $configuration->getDbPassword()); // przykład
  6. }
  7. }

Innym "mechanizmem" jest Dependency Non-Injection (uzależnianie bez wstrzykiwania). Mechanizm ten polega na zainicjowaniu "na sztywno" obiektu klasy, z której potrzebujemy skorzystać. Tak mogłaby wyglądać klasa DataBaseLoader wykorzystująca Dependency Non-Injection
  1. class DataBaseLoader {
  2. // ...
  3. private $_configuration = null
  4. public function __construct() {
  5. $this->_configuration = new ConfigurationInit;
  6. $this->_connection = $this->connect($this->_configuration->getDbHost(), $this->_configuration->getDbUser(), $this->_configuration->getDbPassword()); // przykład
  7. }
  8. }

O tym, który z przedstawionych mechanizmów wybrać musisz zdecydować sam. Dependency Injection daje nam sporą elastyczność, ponieważ przekazywane obiekty nie muszą być obiektami dokładnie jednej klasy, choć muszą spełniać założenia pewnych wzorców, które nazywamy interfejsami. Dependency Non-Injection samo w sobie nie zapewnia nam żadnej elastyczności i wymusza na nas korzystnie z dokładnie takiej, a nie innej klasy (czasami jednak właśnie tego potrzebujemy).

Wszystkie napisane wyżej klasy, to tylko przykłady. W rzeczywistości konstruktor klasy obsługującej połączenie z bazą danych nie potrzebuje wszystkich danych konfiguracyjnych, a tylko niektórych (tzn. nazwa/adres serwera, nazwa i hasło użytkownika bazy danych, czy kodowanie połączenia). Wystarczyłoby zatem przekazać konstruktorowi klasy DataBaseLoader tablicę zawierającą wymagane dane, a nie cały obiekt klasy ConfigurtionInit.

EDIT1: Poprawiłem parę literówek, ale chyba jeszcze jakieś są.
EDIT2: Problem i jego rozwiązanie z dziedziczeniem nie mają nic wspólnego.

Ten post edytował mortus 28.03.2012, 16:31:14
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: 14.10.2025 - 21:11