private ... __constructor...

madproger[777]

Новичок
private ... __constructor...

Всем доброго утра....

Такой вопрос у меня появился....

У меня есть класс... Синглтон...

Насколько корректно сделать конструктор класса закрытым, чтобы не допускать создания объекта через new?
Я например в нижеследующем коде потенциальных багов не вижу, но так как я далеко не профи, то....

class someClass
{
static $classObject;

....
....
....

private function __construct($descriptor)
{
....
....
}


// Если объект данного класса уже создавался, возвращаем указатель на него,
// если такого объекта еще нет - создаем его
public static function initSomeClass($descriptor)
{
if(is_object(self::$classObject))
return self::$classObject;
else
return new someClass($descriptor);
}

............................
............................
............................

}
 

madproger[777]

Новичок
В принципе то же самое что и у меня, верне будет сказать у меня тоже самое что и там :)

Единственное я не понял зачем там используется __CLASS__?

if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}

Почему я должен получить имя класса таким интересным способом, а не просто сделать

self::$instance = new Example();

??
 

madproger[777]

Новичок
Хех... Это то понятно... Только непонятно зачем? Неужели имя класса может меняться??

Либо это сделано для того чтобы это работала и для наследников...

Интересная мысль....
 

hermit_refined

Отшельник
забыли private.
if(is_object(self::$classObject))
return self::$classObject;
else
return new someClass($descriptor);
ошибка - у вас получается не синглетон, а фигня.
Единственное я не понял зачем там используется __CLASS__
я этого тоже не понимаю.
PHP:
self::$instance = new self();
намного эстетичнее.

-~{}~ 19.02.07 10:18:

Либо это сделано для того чтобы это работала и для наследников...
не будет - ни в каком случае.
советую лучше понять, что такое __CLASS__ и статические методы применительно к наследованию.
Неужели имя класса может меняться??
ещё как.
 

Sender

Новичок
madproger[777]
Дело даже не в том что имя класса может меняться. Чтобы сделать класс синглтоном достаточно просто скопировать определенный участок кода и ничего не надо менять.


вот синглтон который использую я, если тебе будет интересно:
PHP:
	class mySinglton
	{
		/** for Singlton pattern */
		static $instance = false;
		function getInstance()
		{
			if( !self::$instance )
			{
				$Reflection = new ReflectionClass( __CLASS__ );
				$fargs = func_get_args();
				self::$instance = call_user_func_array( array( &$Reflection, 'newInstance' ), $fargs );
			}
			return self::$instance;
		}
	}
для наследников это не будет работать, так как в __CLASS__ всегда будет родительский класс
 

hermit_refined

Отшельник
Sender
Reflection - это, конечно, замечательно. только нафиг не нужно.
потому как getInstance() с параметрами - это 3.14...

P.S. и кто съел private перед объявлением $instance и static - перед getInstance() ?..
 

madproger[777]

Новичок
hermit_refined
Спасибо блин огромное.... :) Тоже понял что ахинею полную написал :) Исправил..

Еще одно, во всех примерах конструктор вызывается без параметров. Это так принято? Если нет то можно ли в self() передавать параметры (может плохо искал, но мана по этому методу не нашел :( )
 

Sender

Новичок
hermit_refined
в данном случае getInstance может выступать как конструктор, ему достаточно первый раз передать параметры, затем можно и не передавать.
 

hermit_refined

Отшельник
madproger[777]
параметры в конструктор - разумеется, можно; но т.к. в getInstance() - не нужно, то они обычно не требуются.
иначе - пользуют Registry/Factory.

-~{}~ 19.02.07 10:47:Автор оригинала: Sender

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

madproger[777]

Новичок
hermit_refined
Параметры из getInstance() убрал

Последний вопросик - может кто-нить дать ссылочку на более-менее подробное описание всех паттернов?

То что была выше на php.net - там всего два(мне кажется их больше) и рассмотрен в основном один

Заранее спасибо
 

hermit_refined

Отшельник
madproger[777]
из простого - поищите в сети Php Architects Guide To Php Design Patterns.
периодически кто-нибудь выкладывает.
 

madproger[777]

Новичок
hermit_refined

Жаль на это форуме нельзя плюсики за хорошие ответы ставить

Спасибо

ЗЫ Указанную книгу к сожалению не нашел, зато нашел
Э.Гамма "Приемы ОО проектирования. Паттерны проектирования."
Судя по отзывам - нот бэд

Еще раз всем спасибо за помощь
 
Сверху