Параметры в синглтон

Параметры в синглтон

Припустим есть класс БД который должен иметь экземпляр-одиночку. При создании мне надо в конструктор класса передать аргументы. Как реализовать, подскажите?
У меня есть:
PHP:
class Mysql
   {
      static $instance;
      static public function Singleton() // возможно передавать сюда аргументы, и потом func_get_args(), но это уже массив
         {
            $class_name = __CLASS__;
            return (is_object(self :: $instance)) ? self :: $instance : self :: $instance = new $class_name; // после $class_name надо передать аргументы (массив из func_get_args() не удобно), тогда как?
         }
      private function __construct($host, $username, $password, $name, $blablabla)
         {}
      public function __destruct()
         {}
   }
Спасибо.
 

Alexandre

PHPПенсионер
вар 1в конструктор прописать параметры
PHP:
 static public function Singleton($p1=null, $p2=null,... ) // возможно передавать сюда аргументы, и потом func_get_args(), но это уже массив
         {
            $class_name = __CLASS__;
            return (is_object(self :: $instance)) ? self :: $instance : self :: $instance = new $class_name($p1,$p2);
         }
вар 2 добавить функцию connect()
вар 3 напрсать класс DB, со своим конструктором, производный от Singleton
 

Духовность™

Продвинутый новичок
О каких параметрах речь? логин-пароль-хостнейм? Тогда нафиг - зашить в теле класса в виде констант и не заниматься ерундой.

Если речь о других параметрах, то также объявить их в конструкторе и/или при необходимости добавлять их в класс уже после инстанцирования класса.
 
Сейчас реализовано как вар2. Первый вариант наверно самый правильный под эту задачу, но расматривал вар3:
> производный от Singleton
class DB extends Singleton? Уже испытал такой вариант, но тогда $class_name всегда будет Singleton. Как узнать имя класса создаваемого экземпляра?

-~{}~ 29.01.09 13:36:

О каких параметрах речь? логин-пароль-хостнейм? Тогда нафиг - зашить в теле класса в виде констант и не заниматься ерундой.
Да, о хостнейм и т.д. Зашить - это умышленно лишить себя возможности править конфигурационные данные (конечно не часто исправляются), но начитавшись статей о разделенности, не монолитности, гибкости, все-таки считаю, что настройки к БД лучшее хранить отдельно от класса.
 

HraKK

Мудак
Команда форума
class DB extends Singleton
За это руки отрывать надо.
Factory делайте.

-~{}~ 29.01.09 13:43:

что настройки к БД лучшее хранить отдельно от класса.
Ага в НАСТРОЙКАХ и не класса, а общие. Это как бы, основы приложения. Вот в своем DB и получайте из класса настроек нужную вам инфу.
 

Духовность™

Продвинутый новичок
начитавшись статей о разделенности, не монолитности, гибкости, все-таки считаю, что настройки к БД лучшее хранить отдельно от класса.
Статьи, что ты читал, пишут о другом. Совсем о другом. Они о формировании сложных цепочек взаимосвязанных объектов. А твои параметры подключения к субд, вынесенные в класс конфигурации, как Hrakk написал, или в константы, не приведут тебя к "монолитности" кода. Даже полный дурак знает, что любое приложение начинается с конфига, в котором прописаны все необходимые ключевые настройки приложения.

Далее. Проектируя конструктор сингелтона ты судя по всему не понимаешь, что такое сингелтон и для чего он нужен. А нужен он для того, что бы в любой точке приложения, можно было получить экземпляр класса. Ты будешь везде по 100 раз писать такую конструкцию:

PHP:
$db = DB::Singleton($user, $pass, $host);
Во первых, это жутко неудобно. Во вторых, это опрокидывает в парадокс все идеи о "разделенности, не монолитности, гибкости".
 
triumvirat
я понимаю суть синглтона. не подумал о
PHP:
$db = DB::Singleton($user, $pass, $host);
я так понимаю что оптимальным вариантом для этой задачи есть использование отдельного метода Connect, например.
 

Духовность™

Продвинутый новичок
зачем?

у меня тоже есть метод коннект, но он чисто для того, что бы абстрагировать код он конструктора, который и вызывается в сингелтоне:

PHP:
    public static function getInstance()
    {
        if (!self::$instance)
        {
            $class = __CLASS__;
            self::$instance = new $class();
        }

        return self::$instance;
    }

    /**
    * Конструктор класса.
    * 
    * @access public
    * @param void
    * @return void
    */
    public function __construct()
    {
        $this->connect();
    }


    /**
    * Соеденение с базой данных MySQL.
    * Метод устанавливает соеденение, 
    * выбирает БД, устанавливает нужную кодировку.
    * 
    * @access private
    * @param void
    * @return void
    */
    private function connect()
    {
        if (!is_resource($this->lnk))
        {
            if (!$this->lnk = @mysql_connect(DB_SERVER, 
                                             DB_USER,
                                             DB_PASSWORD
                                            ))
			{
				throw new Exception('Ошибка подключения к СУБД.');
			}

            $this->setCurrentDb(DB_DATABASE);

			$this->query('SET NAMES cp1251');
        }
    }
ВСЁ. Никакого гемороя и попыток искать оптимизацию там, где её искать не нужно.
 
Немного не так у меня было. Был отдельный вызов connect(DB_SERVER, DB_USER, DB_PASSWORD). У Вас наверно лучше.
Спасибо за ответы.

triumvirat
ПыСы: private function __construct() ? ))
 

HraKK

Мудак
Команда форума
Фабрику я имел ввиду где-то то что вам предложили:
Просто у меня можно разные инстансы вызвать( My,pg etc)
$db = DB::Singleton($user, $pass, $host);
Но имхо вариант triumvirat вполне адекватный. Понадобиться что-то круче - сделаете. А безсмысленное награмаждение паттернов зло - это уже антипаттерн. Читаем agile.
 
Сверху