Наследование и и проблема с Singleton

programmer_2006

Новичок
Наследование и и проблема с Singleton

Есть базовый класс A с конструктором и парой методов, есть наследник этого класса B который реализует паттерн синглетон. Проблема в том, что в классе B как и полагается конструктор с типом доступа private и интерпретатор ПХП ругается, требуя, что бы конструктор был public как в родительском классе. Делать доп. врапер для класса B как то излишне, перенести методы из класса A тоже возможности нет, так же как и править его.
Как мне можно сделать из класса B синглетон (очень необходим)... может есть какие то варианты решения подобной проблемы?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
BigWindow, не, ты объясни, как можно иметь конструктор с областью видимости private ? А главное, зачем?
 

BigWindow

Новичок
не, ты объясни, как можно иметь конструктор с областью видимости private?
Очень просто. Ключевое слово private говорит о том, что этот конструктор класса нельзя вызывать извне.

А главное, зачем?
Чтобы нельзя было создавать класс извне.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Ладно, виноват, не подумал. Понял — почему. *не понял, зачем, но это не суть*
Тогда да, тут только или обертку, или сделать die() в публичном конструкторе. Тот же эффект, да.
 

zerkms

TDD infected
Команда форума
*не понял, зачем, но это не суть*
синглтон - это не только способ "правильного" переноса инстанса в глобальную область видимости, но и контроль за тем, что инстанс будет лишь один. в случае, если конструктор публичный - этого гарантировать ты не сможешь.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
zerkms, я к тому, что в php нельзя ни вернуть данные из конструктора, ни обработать ошибку недоступного конструктора. Вот это был бы правильный синглетон. Поэтому, можно просто с таким же успехом в публичном конструкторе делать die().
 

BigWindow

Новичок
HraKK
Я так понял, что класс B (наследник A) сам по сути не является синглтоном. Но при этом фабрика сама эмулирует поведение синглтона, т.е. возвращает только один инстанс искомого класс B. Разумеется в этом случае необходимо, чтобы все классы инстанцировались через фабрику.
 

HraKK

Мудак
Команда форума
флоппик
угу. Только я не считаю его паттерном.

-~{}~ 25.10.08 15:50:

BigWindow
true
 

zerkms

TDD infected
Команда форума
Поэтому, можно просто с таким же успехом в публичном конструкторе делать die().
угу, вероятно просмотр бэктрейса (а иначе я не могу придумать, как удостовериться, что конструктор был вызван из метода-синглтона) с выкидыванием эксепшна был бы элегантнее. в любом случае - получение объекта не так, как это предусмотрел разрбаботчик - ссзб'ство :)
 

zerkms

TDD infected
Команда форума
флоппик
афайк, объект уже инстанциирован во время запуска конструктора (вроде так писал Тони тут, если не ошибаюсь)

-~{}~ 26.10.08 00:01:

чуть добавлю: под объект уже выделена память, туда записаны какие-то данные, но другое дело - что операция присваивания, естественно, из-за эксепшна не будет произведена.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Точно, надо ввести еще два magic-метода: __beforeConstruct() и __afterConstruct() ! ;)
 
Сверху