Зацикливание в конструкторе, что-ли?

Зацикливание в конструкторе, что-ли?

Здравствуйте!
Стараюсь упростить (теперь усложнил) работу с классами и вот на что наткнулся:
PHP:
class theme
	{
		static $instance;
		static public function Singleton()
			{
				$class_name = __CLASS__;
				return (is_object(self :: $instance)) ? self :: $instance : self :: $instance = new $class_name;
			}
		
		private function __construct()
			{
				$core = Core :: Singleton();
				$core -> theme = theme :: Singleton(); // это проблематичная строка
			}
		
		function __destruct()
			{}
		//... пошли методы ...
	}
theme :: Singleton();
вызывает "паденее" (остановку Apache) сервера.
По-моим соображениям, скорее всего зацикливается конструктор.
Что я хотел сделать
1. Вызываем синглтон и он создает обьект обращаясь к конструктору.
2. В конструкторе берется обьект другого синглтона (core).
3. Пытается присвоить $core -> theme (обьекту stdClass) значение которое, теоретически, должен вернуть theme :: Singleton (т.е. самого себя).
Что получилось
Вылетает (останавливаеться) процесс httpd. Логи ничего не пишут, а может не туда смотрю.
ОС: Windows Vista SP1 (как бы банально не звучало. интересно что бы на это фряха ответила :)).
Сервер: Apache 2.2
PHP: 5.2.6
Что бы хотелось услышать
1. Соображения по этому поводу. Может у меня плохая структура?
2. Альтернатива тому что я делал.
3. Может на бейсик пересесть? :)
 

zerkms

TDD infected
Команда форума
скорее всего зацикливается конструктор.
естественно зацикливается.

1. Соображения по этому поводу. Может у меня плохая структура?
может

2. Альтернатива тому что я делал.
а ты не написал, что ты хотел сделать. ты предложил своё неработающее решение. для получения совета - задай вопрос о том, что хочешь получить в итоге.
 

AmdY

Пью пиво
Команда форума
сделай $core ->theme = $this;
хотя, архитектуру возможно стоит изменить
 
AmdY
гг... спасибо.

-~{}~ 09.11.08 14:56:

еще один вопрос, в чем разица:
1.
PHP:
class theme
	{
		static $instance;
		static public function Singleton()
			{
				$class_name = __CLASS__;
				return (is_object(self :: $instance)) ? self :: $instance : self :: $instance = new $class_name;
			}
		
		private function __construct()
			{}
	}
$core = Core :: Singleton();
$core -> theme = theme :: Singleton();
2.
PHP:
class theme
	{
		static $instance;
		static public function Singleton()
			{
				$class_name = __CLASS__;
				return (is_object(self :: $instance)) ? self :: $instance : self :: $instance = new $class_name;
			}
		
		private function __construct()
			{
				$core = Core :: Singleton();
				$core -> theme = $this;
			}
	}
theme :: Singleton();
 

Baranov_Dron

Новичок
ЭЭ да отличий нету, просто во втором случае одна операция переносится в конструктор, я бы немного переделал код, чтоб был более читабельный:
private function __construct()
{
Core :: Singleton()-> theme = $this;
}
Но я откровенно говоря не понимаю смысла данного кода, может быть имеет смысл создать объект theme в конструкторе класса Core? Ведь строка $core -> theme нарушает смысл инкапсуляции.
 

AmdY

Пью пиво
Команда форума
в каком это месте нарушается инкапсуляция?
 

AmdY

Пью пиво
Команда форума
тьфу, я не о том классе подумал. согласен, нужно бы сетер прицепить, а не заметил, потому что сам не большой любитель set* get*, и часто их опускаю :(
 

Lews

Новичок
Почему чушь? Мне тоже кажется строка слишком навороченной.

if(self::$instance == null){
self::$instance = new theme();
}

return self::$instance;

Читается на порядок проще.
 

AmdY

Пью пиво
Команда форума
поддерживаю Alexandre, я вообще хотел привести товарищу код, но стало лень рефакторить данный кусок.
Имхо, правильнее было бы передавать объект в Core уже после отрабатывания конструктора и можно было бы замечательно всунуть в Singleton. Да и переменную $class_name не обязательно было бы заводить каждый раз.
 

zerkms

TDD infected
Команда форума
Lews
я имел ввиду его последнее предложение про копипаст. не считаю копипаст реализации синглтона плохой практикой.
 
Сверху