Паттерн Singleton на PHP5

neko

tеam neko
есть такое мнение что они вообще нигде ненужны
потому что вносят больше проблем чем решают
 

neko

tеam neko
в том что гофовское определение данного паттерна не дает ответов на некоторые вопросы, которые неизбежно возникают у имплементаторов
надеюсь ты его читала прежде чем этот вопрос задавать?

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

svetasmirnova

маленький монстрик
Фразой
>защитим программиста от него самого
характеризуется большинство программных решений;)

Со временем жизни: да, убить его - это проблема. Хотя при применении синглтонов у меня таких желаний не возникает.
 

neko

tеam neko
Фразой
>защитим программиста от него самого
характеризуется большинство программных решений
это что шутка такая?

убить его - это проблема
тут 2 проблемы на самом деле
либо "когда убить"
либо "а если я его вообще не буду убивать, как убедится что он умрет не раньше срока"

и это только ОДНА сторона
я честно невижу пользы от синглтонов
периодчески мне в руки попадают либы в которых сказано "пожалуйста вызывайте этот метод один раз на тред" и ничего страшного, я еще не умер от следования этим рекоммендациям
 

svetasmirnova

маленький монстрик
Я их использую в таких случаях, когда нужно поведение a-la static, но без создания экземпляра не обойтись.
 

Thorn

Guest
Дамы и господа, странная у вас традиция, по любому вопросу разводить споры :D

"Самый лучший способ спорить: выслушать человека, а потом поступить так, как ты считаешь лучше. Это экономит время и речевые усилия." (с) Dmitry Smirnov

Вопрос-то помните о чем был изначально ? :)

Vasya
PHP 5.0.1 doesn't seem to mind if you call a static method in a non-static context, though it might not be the best of style to do so.
А вот тут все с точностью наоборот описано по сравнению с моей ситуацией...никаких предупреждений не выдается )))
 

neko

tеam neko
да собственно никто не спорит
я просто свое мнение высказал
 

Screjet

Новичок
синглтон для пхп4 :)

PHP:
class singlton {

	function singlton(){
		if ( isset($GLOBALS[__CLASS__]) ){
			trigger_error(__CLASS__.'::constructor(): Only once can instance "'.__CLASS__.'" object.',E_USER_ERROR);
		}
		$GLOBALS[__CLASS__] = &$this;
	}
	// any methods..
}

new singlton();
new singlton();
 

syfisher

TDD infected!!
Это может быть немного offtop, однако позволю себе заметить, что Singleton - это как правильно выразился neko - "идеологически неправильный".

Мы как-то им очень увлеклись, и использовали его и для очень многих классов, например, Request, Response, Tree и т.д. Однако оказалось, что это приводит к большим проблемам для тестирования и наносит практически непоправимый ущерб гибкости кода, так как при использовании одиночек мы явно указываем имя класса, а это с точки зрения объектно-ориентированного программирования в корне неправильно.

В ходе опытов выяснилась только 1 сфера применения данного паттерна - Registry, которая работает как глобальная фабрика для часто используемых объектов. Во всех остальных случаях целесообразнее использовать Lazy Loading и Monostate.

Приблизительно идею Registry можно взять отсюда.
http://www.phppatterns.com/index.php/article/articleview/75/1/1/
 

Thorn

Guest
by Screjet
только в объекте можно вызывать статические методы.
чегггооо ??? ))))) по-моему ты ошибаешься ;) они на то и статические, чтобы их можно было выполнять без создания объекта:rolleyes:
 

Vasya

Guest
Автор оригинала: Thorn
Вопрос-то помните о чем был изначально ? :)
Давайте вспомним. Вопрос был о том, почему нестатический метод успешно вызывается как статический:
PHP:
class Test { 
   function non_static() { 
       echo "I am not a static method<br />\n"; 
   } 
} 
Test::non_static();
Я нашёл похожий вопрос и ответ на него. С точнотью до наоборот -- статический метод вызывается как динамический.
Также там было следующее:
PHP complains if you try to try to call a non-static method in a static context (if your error reporting is cranked up to E_STRICT).
"ПХП ругается, если вы пытаетесь вызвать нестатический метод в статическом контексте..." Это можно интерпретировать как соответствующее вашему вопросу заявление. Да?

Дык вот ответ тамошнего редактора гласит, что "это сделано для обратной совместимости".
Это объясняет странное поведение ПХП5 в вашем случае?
И если нет, то не лучше ли будет спросить об этом все-таки у тамошнего редактора?
 

Thorn

Guest
to Vasya:
Сорри, я конечно же ошибся...просто прочитал первую часть цитаты с php.net приведенную тобой (надеюсь не обидел что на "ты") а на вторую не обратил внимания. Спасибо.

Только вот один момент. Предупреждений никаких не выдается все равно. Уровень отладки стоит E_ALL & E_STRICT.

Ну да ладно. Я просто уже смирился с тем что дела обстоят именно так. А вообще было бы здорово, если бы эту самую совместимость можно было отключать. А то бред какой-то получается.

Тему можна закрывать.
 

fixxxer

К.О.
Партнер клуба
а вы, товарищ Скрежет, ногой за ухом не пробовали чесать? хотя подозреваю что защитили как минимум кандидатскую по этой тематике.
 

Screjet

Новичок
а вы, товарищ Скрежет, ногой за ухом не пробовали чесать?
Была бы нога, попробывал бы :)

А насчет статических стормозил (больше траву не курю..), сорри. (считайте шуткой:))
Даже с Тони был както спор на тему этой ошибки.. кажись на предмет совместимости.. Но как у нас говорят: это было давно и неправда :)
 

Sherman

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