Перейти к содержимому

Фото
- - - - -

Singleton & PHP


  • Вы не можете создать новую тему
  • Please log in to reply
4 ответов в этой теме

#1 Voland

Voland
  • Пользователь
  • 272 сообщений

Отправлено 15 января 2007 - 22:50

Имеется код такого класса:

	class Singleton {
		
		private static $instances = array();
		
		private function __construct() {}
		private function __clone() {}
		
		public static function &getInstance($class) {
			
			if (!array_key_exists($class, self::$instances)) {
				self::$instances[$class] = new $class;
			} 
			
			$instance =& self::$instances[$class];
			
			return $instance;
			
		}
		
	}

Ломаю голову как же передать параметры передающиеся в конструктор при создании класса. В строке

	self::$instances[$class] = new $class;

  • 0

#2 dmitry.eu

dmitry.eu
  • Пользователь
  • 37 сообщений
  • Откуда:Таллин

Отправлено 15 января 2007 - 23:02

Voland, через массив или через call_user_func_array(). Кстате, ссылку в во втором zend'е можно не ставить, тем более такой код в последствии будет вызывать E_STRICT.
А вообще, есть специализированные форумы :)
  • 0

#3 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 15 января 2007 - 23:41

Voland, это уже не Singleton получается... Во-первых, у тебя Singleton с массивом instances. Singleton же нужен для того, чтобы иметь всегда один экземпляр класса! Ты в своём примере стал описывать фабрику объектов. Если тебе нужен некий гибрид, добавь метод, который будет создавать объект, а getInstance будет только получать его instance. Не мешай всё в один метод, а то получится каша :)
  • 0

#4 Voland

Voland
  • Пользователь
  • 272 сообщений

Отправлено 16 января 2007 - 00:17

dmitry.eu, про call_user_func_array() я знаю. Я почему-то подумал что это не прокатит. Я предположил что такая конструкция
call_user_func_array(new $class, $args);
создаст сначала класс, вызвав его конструктор, а потом вызовет некую ф-ю с параметрами. Сейчас проверю.

А по поводу форума... взял ближаший.

Setor, пожалуй ты прав, переиначу немного код, но вопрос пока открыт.


upd

По поводу
call_user_func_array(new $class, $args);
я был не совсем прав но тем не менее не работает.

Остаётся сделать как сказал Setor

Сообщение изменено: Voland (16 января 2007 - 00:24 )

  • 0

#5 dmitry.eu

dmitry.eu
  • Пользователь
  • 37 сообщений
  • Откуда:Таллин

Отправлено 16 января 2007 - 01:02

Setor прав. У Singleton несколько иная идея.
Voland, конечно, вы можете знать много, но вы не читаете комментарии. Читайте комментарии и всё будет хорошо.
http://www.phppatterns.com/docs/start
  • 0