Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Jak zmusic klasę do 'podszycia' się pod inną klasę, Generalnie problemy z obiektowością PHP5
matid
post
Post #1





Grupa: Zarejestrowani
Postów: 362
Pomógł: 0
Dołączył: 18.02.2004
Skąd: Knurów

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


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
Vengeance
post
Post #2





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


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 ;]


--------------------
Go to the top of the page
+Quote Post
hawk
post
Post #3





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

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


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.
Go to the top of the page
+Quote Post
matid
post
Post #4





Grupa: Zarejestrowani
Postów: 362
Pomógł: 0
Dołączył: 18.02.2004
Skąd: Knurów

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


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 12:29