Йа гений? =)

algo

To the stars!
cDLEON: у меня тоже раньше был такой вопрос.

Потом понял.

Статический объект
1) не имеет конструктора пристойного, статик конструктор в пхп вроде отсутствует, но даже если он есть - обычный конструктор лучше. И деструктора статического нет ;)

2) проблемы при наследовании со статическими свойствами

Вот такие 2 причины.


Лично я использую синглтоны в ПХП вместе с функциями так:
объявляю синглтон, например
Код:
class myDB { 
   protected $instance;
   public static function getInstance() { ... }
}
И тут же объявляю функцию
Код:
function myDB() { return myDB::getInstance(); }
Так что вместо длинных вызовов
Код:
myDB::getInstance()->get_query_result(..)
имею простой вызов

Код:
myDB()->get_query_result(..)
 

cDLEON

Онанист РНРСlub
algo
1) не имеет конструктора пристойного, статик конструктор в пхп вроде отсутствует, но даже если он есть - обычный конструктор лучше. И деструктора статического нет
Хех. Ну с конструктором проблему решить можно. А вот с деструктором...С деструктором можно только костыль сделать 8) register_shutdown_function () =))) Я раньше на ПХП4 такой костыль вечно совал...Если деструктор требовался и не было разницы в каком месте он вызывался 8)
2) проблемы при наследовании со статическими свойствами
Какие проблемы? Может это у меня одного статические свойства наследуются? 8)
 

CatManZero

Новичок
Немножко погуглил. И вот что нашел на эту тему:
Шаблон Singleton (одиночка), например, используется для инкапсуляции создания объекта, чтобы сохранять контроль над ним. Это не только гарантирует то, что будет создан только один его экземпляр, но также допускает "ленивую" инициализацию; то есть, инициализация объекта будет задержана до тех пор, пока он действительно не понадобится. Это особенно выгодно, если конструктор должен выполнять дорогостоящие операции, такие как обращение к удаленной базе данных.

Мало того. Практически везде указано, что Singleton допускает переменное количество экземпляров.

Я сам по началу был удивлен... :cool: Но в принципе всё логично: одна точка доступа - полный контроль за кол-вом экземпляров.
 

dark-demon

d(^-^)b
$db= DB::getInstance();
$db->die();

global $db;
$db->init()->die();
$db->die(); // либо сразу дай, если инициализация нафиг не сдалась..

ленивая инициализация - не аргумент.
 

cDLEON

Онанист РНРСlub
dark-demon
Можно узнать, зачем тебе глобалы,если есть DB::getInstance() ? =)
 

dark-demon

d(^-^)b
лично я ни теми, ни другими не пользуюсь :) у меня что-то типа варианта algo
 

CatManZero

Новичок
Автор оригинала: dark-demon
$db= DB::getInstance();
$db->die();

global $db;
$db->init()->die();
$db->die(); // либо сразу дай, если инициализация нафиг не сдалась..

ленивая инициализация - не аргумент.
В смысле не аргумент? :cool:
Человек спрашивает, зачем нужен Синглтон. Я привел ситуацию, где он может быть нужен.

К тому же приведенное выше описание скорее всего означает не взаимодействие непосредственно с DB, а что-то вроде этого:
PHP:
class Admin {
    private static $instance = null;
    protected $db;

    function __construct()
    {
        $this->db = DB::getInstance();
        $this->load();
    }

    static function getInstance()
    {
        if(!self::$instance)
            self::$instance = new Admin();
        return self::$instance;
    }
    
    function load() { $result = $this->db->query(...); ... }
    
    function getRights() { ... }
}
Работать с этим можно так:
PHP:
Admin::getInstance()->getRights();
Если нам не нужна информация о правах администратора, то не нужно загружать данные о нем из БД, а может даже и вообще создавать соединение.

Естественно "ленивая" инициализация - не единственный случай, когда нужен синглетон.
 

cDLEON

Онанист РНРСlub
Кстати. По поводу деструктора...
Нужно либо вводить новый метод, который будет убивать static $instance; Либо этот деструктор будет срабатывать только тогда, когда сборщик мусора будет чистить память (т.е. после выполнения всего скрипта). Следовательно - по сравнению с register_shutdown_function разницы ноль....
---
Вызов "конструктора" решается через вызов __get,__set....
---
Подвожу итог:
Для ПХП паттерн синглтона и метод с статическими переменными имеют только идеалогическую разницу.
Но синглтон требует меньшее количество извращений - следовательно предпочтительнее использывать его 8)
---
Всем спасибо за участие 8)
 

zerkms

TDD infected
Команда форума
Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему
глобальную точку доступа.
(c) GoF
CatManZero
Мало того. Практически везде указано, что Singleton допускает переменное количество экземпляров.
с каких собсна пор? ;)
 

algo

To the stars!
Что касается конструктора - какой вариант решения ты предлагаешь ?
Имей в виду, конструктор может (и должен) использовать другие синглтоны (статики?)

Поиграйся, возможно тебе синглтон понравится ;)
Конструктор в синглтоне гибче и правильнее любого из вариантов статик конструкторов, которые я видел.

--------

По деструктору - register_shutdown_function это костыль, как ты сам сказал. Впрочем, деструктор для меня не был причиной, он ваще кривой в пхп. Конструктор - важнее в 1000 раз.

-------

Что касается наследования - нашел тебе отличную статью
http://socket7.net/article/php-5-static-and-inheritance

Это тоже довод против статиков, в пользу синглтонов.

-~{}~ 19.11.07 04:53:

Автор оригинала: zerkms
CatManZero

с каких собсна пор? ;)
zerkms, видимо имеется в виду расширенный вариант синглтона, когда объекты по ключам делятся. Типа

Код:
class DB {
   protected static $instances = array();

   public static getInstance($key) {
      get_or_create self::$instances[$key]
  }
}
 

CatManZero

Новичок
Автор оригинала: zerkms
CatManZero

с каких собсна пор? ;)
Я не знаю с каких пор :cool: Но посмотрите в википедии,
тут например...
У меня есть книга по паттернам 2001-го года выпуска. Так там слово в слово написано тоже самое:
"допускает переменное количество экземпляров"
 

zerkms

TDD infected
Команда форума
zerkms, видимо имеется в виду расширенный вариант синглтона, когда объекты по ключам делятся. Типа
не будет ли это уже другим порождающим паттерном, тогда? ;)

У меня есть книга по паттернам 2001-го года выпуска. Так там слово в слово написано тоже самое:
и всё таки в вопросах "классических" паттернов я бы больше полагался на GoF :)
 

CatManZero

Новичок
Автор оригинала: zerkms

и всё таки в вопросах "классических" паттернов я бы больше полагался на GoF :)
Может быть, может быть... Если исходить из перевода Singleton с английского, то возможность создания нескольких экземпляров (пусть и фиксированного кол-ва), с помощью этого паттерна кажется странным...
Но всё же... :confused:
 
Сверху