Mam zdefiniowaną abstrakcynją klasę singleton (posłużyłem się kodem z php.net). Ponieważ nie używam php 5.3.0 (tylko 5.2.8) zdefiniowałem sobie funkcję get_called_className.

  1. <?php
  2.  
  3. abstract class AbstractSingleton {
  4.  
  5.    protected function __construct() {
  6.    }
  7.  
  8.    final public static function instance() {
  9.        static $aoInstance = array();
  10.  
  11.        $calledClassName = get_called_className();
  12.  
  13.        if (! isset ($aoInstance[$calledClassName])) {
  14.            $aoInstance[$calledClassName] = new $calledClassName();
  15.        }
  16.  
  17.        return $aoInstance[$calledClassName];
  18.    }
  19.  
  20.    final private function __clone() {
  21.    }
  22. }
  23.  
  24. function get_called_className() {
  25.    if (!function_exists('get_called_class')) {
  26.        
  27.        $bt = debug_backtrace();
  28.        if (isset($bt[1]['file']) && isset($bt[1]['line']) && isset($bt[1]['function'])) {
  29.            $lines = file($bt[1]['file']);
  30.            $pattern = '/([a-zA-Z0-9_]+)::'.$bt[1]['function'].'/';
  31.            preg_match($pattern, $lines[$bt[1]['line']-1], $matches);
  32.            if (count($matches)>0)
  33.                return $matches[0];
  34.        }
  35.        return false;
  36.    }            
  37. }
  38. ?>


Teraz po tej klasie dziedziczę i tworzę obiekt odpowiezialny za łączenie z bazą danych:
  1. <?php
  2. class DatabaseConnection extends AbstractSingleton {
  3.  
  4.    protected $connection;
  5.  
  6.    protected function __construct() {}
  7.  
  8.    public function connect($database) {
  9.        $this->connection = mysql_connect(
  10.                                $database['hostname'],
  11.                                $database['username'],
  12.                                $database['password']);
  13.                            
  14.        if ($this->connection === false)
  15.            throw (new Exception('Błąd połączenia z bazą danych'));
  16.            
  17.        mysql_select_db($database['database'], $this->connection);
  18.    }
  19. }
  20. ?>

Problem w tym, że kiedy później chcę korzystać z tego obiektu (w taki sposób)
  1. <?php
  2. DatabaseConnection::instance()->connect($config_array);
  3. ?>

dostaję błąd w autoloaderze:

Fatal error: require_once() [function.require]: Failed opening required 'class/DatabaseConnection::instance.class.php'

nie mam pomysłu jak to zrobić dobrze, czy połączenie z bazą danych musi nastąpić w konstruktorze? Czy do konstruktora mogę przekazać jakieś parametry? Jak się potem tym obiektem posługiwać?