Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak zmusic klasę do 'podszycia' się pod inną klasę
Forum PHP.pl > Forum > PHP > Object-oriented programming
matid
Mam następujący kod:
  1. <?php
  2.  
  3. require( 'classes/drivers/adodb/adodb.inc.php' );
  4.  
  5. /**
  6.  * Database class
  7.  * 
  8.  * @author Mateusz Drozdzynski <matid@alfa-system.pl>
  9.  * @version 1.0
  10.  * @access public
  11.  * @copyright Mateusz Drozdzynski
  12.  */
  13. class Database
  14. {
  15. /**
  16.  * ADODB::ADODB
  17.  */
  18. function __construct()
  19. {
  20. $Config = Singleton::getInstance( 'Config' );
  21. $this->resConnection = &ADONewConnection( $Config->getValue( 'database/type' ) ); 
  22. $this->resConnection->PConnect( $Config->getValue( 'database/host' ), $Config->getValue( 'database/user' ), $Config->getValue( 'database/password' ), $Config->getValue( 'database/database' ) );
  23. }
  24.  
  25. }
  26.  
  27. ?>

I teraz inicjuję tą klasę poprzez takie wywołanie:
  1. <?php
  2. $Database = Singleton::getInstance( 'Database' );
  3. ?>

Prowadzi to po prostu do zwrócenia obiektu klasy utworzonego poprzez normalne new.

A teraz przejdźmy do sedna sprawy:
Ma ktoś pomysł jak zmusić klasę Database do zwrócenia przy tworzeniu referencji do innej klasy i autodestrukcji instancji samej siebie?

Zależy mi na takim przebieku wydarzeń:
  • Ładuję klasę Database
  • Uruchamia się konstruktor, który przygotowuje instancję klasy ADODB
  • Po wykonaniu konstruktora nie zostaje zwrócona instancja klasy Database tylko ADODB (Database::$resConnection)
Nie wiem czy jest to w jakiś sposób możliwe, ale z góry dziękuję za wszystkie wyjaśnienia.
Vengeance
hmm... zamiast robic w klasie Singleton jak podejrzewam

Kod
<?php
class Singleton
{
   function getInstance($arg)
   {
      $ret = new $arg();
      return $ret;
   }
}
?>


mozes dac np.
Kod
<?php
class Singleton
{
   function getInstance($arg)
   {
      $ret = new $arg();
      return $ret->singleton();
   }
}

$db = Singleton::getInstance('dbdriver');
?>


Kod
<?php
    class Database
    {
        function singletont()
        {
            $Config = Singleton::getInstance( 'Config' );
            $this->resConnection = &ADONewConnection( $Config->getValue( 'database/type' ) );
            $this->resConnection->PConnect( $Config->getValue( 'database/host' ), $Config->getValue( 'database/user' ), $Config->getValue( 'database/password' ), $Config->getValue( 'database/database' ) );
            return $this->resConnection;
        }
    }
?>


to 1 sposob. drugi taki:
Kod
<?php
    class Database extends AdoDb
    {
    }
?>


czy jak tam sie nazywa klasa adodb nie wiem ;]
hawk
1) Proszę, nie używaj nazwy singleton, bo nie masz tutaj żadnego singletona, a twoje nazewnictwo służy tylko temu, żeby utrudnić zrozumienie kodu.

2) Konstruktor nie może zwrócić żadnej instancji, bo konstruktor nic nie zwraca. Nie może również wywołać destruktor, bo jeszcze nie ma obiektu który można by niszczyć. Pomyśl trochę jak to w środku działa.

3) To, o co się pytasz, to fabryka. Pełna nazwa to bodajże Factory Method.
matid
Przepraszam, bo rzeczywiście nagiełem trochę zasady i klasa Singleton w rzeczywistości jest bardzo dziwnym tworem i więcej ma wspólnego z rejestrem niż z Singleton'em. Po prostu mój kod nadaje się do generalnej restrukturyzacji.
Dziękuję wszystkim za pomoc w rozwiązaniu problemu, szczególnie hawkowi który uświadomił mnie w mojej niewiedzy :]
Temat uważam za zamknięty.
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.