Реализация Singleton в PHP

TheWanderer

Новичок
Реализация Singleton в PHP

У меня следующая проблема. Существует единственный системный объект, который иницализирует другие объекты, вроде драйвера БД, шаблонизатора и т.п. Стандартный набор. Кроме того, в зависимости от запроса пользователя он инициализирует еще один или несколько объектов (список их имен хранится отдельно). Задача в том, чтобы созданные драйвер БД, шаблонизатор и те самые "и т.п." были доступны из этих объектов. В данный момент контструктору передается ссылка на системный объект и код выглядит следующим образом:
PHP:
class example
{
	private $system;

	public function __construct($system)
	{
		$this->system = $system;
		$this->start();
	}
	
	public function start()
	{
		$this->system->db->query('SELECT c,d,e FROM table1 WHERE a=b');
	}
}
Естетсвенно, такие трехэтажные конструкции - это форменное безобразие и тихий ужас. Вопрос в том, как мне организовать свой код, чтобы подобных проблем не было. Неужели реализация Singleton в PHP обязательно должна упираться в obj::getRef()? У меня стойкое ощущение, что я изобретаю велосипед и прикрутил колеса совсем не туда, куда следует.
 

TheWanderer

Новичок
Никто. Но изобретение велосипедов - моя работа и мое хобби. Поэтому меня интересует, могут ли посоветовать другие изобретатели велосипедов, куда мне все-таки следует приделать колеса. И ничего более. :)
 

Vasya

Guest
такие трехэтажные конструкции - это форменное безобразие и тихий ужас
Не согласен -- вполне нормальная конструкция.
Imho, тут есть только одно "но". Если объект system один в системе, то для него будет опрадано использование паттерна синглетон. Тогда его не нужно будет передавать в конструктор другого объекта. Вместо этого его можно просто получить там, где он необходим.
PHP:
class example 
{ 
    private $system; 

    public function __construct()  { 
        $this->system = & TSystem::getInstance(); 
        $this->start(); 
    } 

    public function start() { 
        $this->system->db->query('SELECT c,d,e FROM table1 WHERE a=b'); 
    } 
}
 
Сверху