Singleton

Dareczek

Новичок
Есть вопрос, просто хочу уточнить.
PHP:
	private static $instance;
	
	private function __construct()
	{
	}
	public static function Instance()
	{
		if (self::$instance == null)
			self::$instance = new M_Startup();
		
		return self::$instance;
	}
Вот это паттерн синглтон. Если создавать новый объект т.е через new, всегда вызывается конструктор __construct(), мы его сделали приватным, и уже такого сделать не можем. Но ведь self::$instance = new M_Startup(); создасть новый объект и без ошибки. Он что не обращается тогда к __construct()?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Dareczek
Хреновый синглтон, это раз. Во вторых он обращается к конструктору изнутри, где это разрешено. Ты же наверняка знаешь про области видимости private методов, не так ли?
 

Dareczek

Новичок
ААААА, я чето затупил, он же точно вызвет объект из тела класса, спасибо. А почему синглтон хреновый?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
ИМХО, я бы писал:
0. private static $instance = null;
1. self::$_instance === null
2. self::$_instance = new self;
 

Dareczek

Новичок
2. self::$_instance = new self;
Как это понять? Вы "коректировали" self::$instance = new M_Startup();? Или нет?
 

Dareczek

Новичок
new self; что он создат? Т.е если мы напишем self то он создат новый класс? Т.е сократим код?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Dareczek
Открываем мануал и читаем там что это такое.

PS: создается новый объект того класса, в котором такой код написан, при этом имя класса явно писать не надо.
 

hell0w0rd

Продвинутый новичок
fixxxer
А смысл делать трейтом?
И можно дать ссылку, где разъясняется матчасть по поводу self/static?) - не актуально, позволяет наследоваться, понял)
 

Вурдалак

Продвинутый новичок
А смысл делать трейтом?
Чтобы использовать. Пример по твоей ссылке не совсем рабочий: от него нельзя наследоваться, это просто пример Singleton'а (потому что там self и будет создаваться инстанс Singleton, а не наследника). То есть предполагается в этом примере, что каждый класс-singleton должен иметь такой набор методов. Чтобы избежать этой избыточности, это можно вынести в трейт.

А именно трейт — ну, потому что логичнее. Singleton — это такое свойство объекта, свойств может быть много разных и они могут быть в разных комбинациях, поэтому наследование тут не должно быть.
 

hell0w0rd

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