единый Singleton для extented классов

alan4ick

Новичок
единый Singleton для extented классов

Хочется чтобы функция Singleton была только в родительском классе, чтобы не описывать ее каждый раз в расширенном классе
, но тогда возникает проблема с созданием обьекта.

Из singleton метода никак не получить имя расширенного класса, так как возвращается имя родительского класса.

Как можно решить эту проблему ?

PHP:
class DB{

    public static function singleton()
    {
        if (null === self::$_instance) {
            $c = __CLASS__;
            self::$_instance = new $c;

        }

        return self::$_instance;
    } 
}
А хотелось бы использовать данную методику для создания классов для работы с несколькими соединениями к базам:
DB_News::singleton()->getNews();
DB_News::singleton('other_mysql_server')->getNews();

+ данного метода, что не создается соединения с базой, если нет в этом нужды
 

zerkms

TDD infected
Команда форума
эта проблема косвенно подталкивает к тому, что чрезмерно усердствовать синглтонами не стоит ;)
 

alan4ick

Новичок
Не логично что даже при вызове статического метода для расширенного от абстрактного класса не получить имя расширенного класса.

Интересно, а такое возможно.. в Java например?
 

cDLEON

Онанист РНРСlub
В ПХП 5.3 это "исправлено" + добавлены нэймспейсы!!! :joy:
 

kirill538

Новичок
Вы же все равно знаете имя класса для типа базы. Почему нельзя передать его имя непосредственно в метод инстанса синглтона DB ? К тому же, сам класс DB не должен быть в чистом виде синглтоном, в единственном числе должны существовать только подключения к конкретным базам. И ваш метод DB::singleton() суть фабрика.
 

alan4ick

Новичок
cDLEON
Скачал 5.3 snaps, но все тоже самое.

PHP:
abstract class classParent
{
	static function getClass(){	echo __CLASS__; }
}

class classBaby extends classParent{}

classBaby::getClass();
Вы же все равно знаете имя класса для типа базы. Почему нельзя передать его имя непосредственно в метод инстанса синглтона DB
один из вариантов, но не столь красив как первый вариант=)
 
Сверху