Autor | Zpráva | ||
---|---|---|---|
kabax Profil * |
#1 · Zasláno: 6. 7. 2010, 19:09:09
Něco jsem si čítal o o singletonech v php, ale nejsem z toho moc moudrý. Je sice hezké, že teoreticky zaručí vytvoření jen jedné instance daného objektu, koukal jsem že to použivá třeba Nette u Sessions, ale moc nechápu smysl takového řešení. Může mi to někdo více objasnit? Cituji z zdrojak.root.cz:
$session = Environment::getSession(); // nastavení expirace: relace vyprší po 3 hodinách neaktivity $session->setExpiration(3 * 60 * 60); ... Když chci mít jen jednu instanci objektu tak proč vlastně používat objekty? Nebylo by jednodušší a správnější něco jako sessionTrida::setExpiration(3 * 60 * 60); apod. ? |
||
Majkl578 Profil |
#2 · Zasláno: 6. 7. 2010, 19:19:13
To jsi trochu vytrhl z kontextu. Sama třída Nette\Web\Session singletonem není. To co uvádíš má na starosti třída Nette\ServiceLocator, která se stará o služby napříč frameworkem.
Nicméně lze říct, že dvě instance třídy Session by nedávaly smysl, jelikož v aplikaci může být aktivní jen jedna relace session. Proto je udržována jen jedna její instance, se kterou pracuje vždy když si vyžádáš instanci třídy Session. Teorii o tom co je singleton si můžeš přečíst na Wikipedii (případně v angličtině - rozsáhleji). |
||
Nox Profil |
#3 · Zasláno: 6. 7. 2010, 19:25:03
kabax:
Nevím jestli správnější, jednodušší není moc jisté, takto to třeba můžeš předávat jako parametr Trocha hloubání Mr. Grudla http://phpfashion.com/je-singleton-zlo http://phpfashion.com/singleton-sofie-s |
||
kabax Profil * |
#4 · Zasláno: 6. 7. 2010, 19:38:03
Z toho stejně nejsem moc moudrý. Dám konkrétní příklad: mám Translator.php a v něm statickou třídu Translator, která se stará o překlady textů pomocí gettext(nastavení jazyka, kódování, uchování jazyka apod.). Má smysl z takové třídy vyrobit singleton?
|
||
Johnik Profil |
#5 · Zasláno: 6. 7. 2010, 19:43:10
kabax
V php nemá singleton žádný smysl, protože se všechno vytvoří, provede a zahodí. Tudíž je jedno jestli je to singleton nebo klasická instance. |
||
Joker Profil |
#6 · Zasláno: 6. 7. 2010, 20:29:36 · Upravil/a: Joker
kabax:
Pochopil jsem tu původní otázku jako „Není singleton zbytečný, když můžu docílit vpodstatě téhož definováním všech členů třídy statických?“ Rozdíl bude například v případě, kdy je potřeba na začátku tu třídu nějak inicializovat, což normálně dělá právě konstruktor. Ve chvíli, kdy by programátor musel pamatovat na to, aby na začátku práce s tou statickou třídou zavolal třeba Trida::Init(), bylo by podle mě lepší využít právě instanci a tu inicializaci dát do konstruktoru. Ohledně toho, že singleton jako návrhový vzor je trochu kontroverzní, viz předchozí diskutující. |
||
Mastodont Profil |
#7 · Zasláno: 6. 7. 2010, 21:02:41
kabax:
Siíngleton se liší hlavně tím, že je u něj vytvářena instance, u statické třídy žádná instance není. Další rozdíly najdeš googlením. překlady textů pomocí gettext(nastavení jazyka, kódování, uchování jazyka apod.) Návrh aplikace si dělá každý sám, ale IMHO nastavení jazyka a kódování patří do konfigu celé aplikace, ne jenom translátoru. A pokud to jinak používáš jen pro překlady stringů, tak by stačila i obyčejná function. Není nutné cpát objekty úplně všude. |
||
Majkl578 Profil |
#8 · Zasláno: 6. 7. 2010, 21:12:45
Ještě bych uvedl pár, alespoň pro mě často důležitých výhod singletonu oproti statické třídě. Jelikož jde o instanci, lze použít overloading, tedy __get, __set a __call. To mi umožňuje mapovat gettery z getFoo() na property foo. U statické třídy jsem omezen pouze na __callStatic.
Nevýhoda singletonu je krásně popsána v druhém článku v [#3]. |
||
Ofi Profil |
#9 · Zasláno: 6. 7. 2010, 21:33:25
kabax:
vem si případ připojení k databázi - to chceme mít jen jedno... pokud na to použiješ singleton, máš zaručeno, že víc připojení nebude... výhodou třídy pak je destruktor, který se může postarat o ukončení spojení při ničení objektu... další výhodou takové třídy můžou být různé další metody pracující s databází... |
||
Mastodont Profil |
#10 · Zasláno: 6. 7. 2010, 21:35:03
připojení k databázi - to chceme mít jen jedno
Jak kdo, jak kdy ... |
||
Ofi Profil |
#11 · Zasláno: 6. 7. 2010, 22:26:26
Mastodont:
„Jak kdo, jak kdy ...“ příklad? |
||
Lamicz Profil |
#12 · Zasláno: 6. 7. 2010, 22:39:48
Ofi:
Můžeš mít např. data aplikace v PostgreSQL a cache v MySQL MyISAM a potřebuješ mezi nimi přepínat, možností je plno... |
||
Mastodont Profil |
#13 · Zasláno: 7. 7. 2010, 06:42:30
Cache v SQLite, data jinde.
|
||
Nox Profil |
#14 · Zasláno: 7. 7. 2010, 09:47:53
Ofi:
Většinou to jde už o větší systémy, takže k příkladům prostě rozšiřitelnost nebo pro oddělený log server, záložní server... |
||
Ofi Profil |
#15 · Zasláno: 7. 7. 2010, 12:51:05
reaguji na Lamicze, Mastodonta:
dík za příklady :) to mě nenapadlo :) |
||
Joker Profil |
#16 · Zasláno: 7. 7. 2010, 13:16:20
Ofi O tom se právě píše v článcích odkazovaných v [#3]: V mnoha situacích se hodí jedna globální instance nějaké třídy. Je ale otázka, zda kvůli tomu v návrhu aplikace přikazovat právě jednu instanci dané třídy.
|
||
Ofi Profil |
#17 · Zasláno: 7. 7. 2010, 21:04:05
reaguji naJokera:
jo tak to si přečtu :) já jsem zvyklý z Javy na singletony takže se mi v PHP používají snadno a celkem mi mnohdy takové řešení vyhovuje - to jen pro doplnění :) |
||
H13 Profil |
#18 · Zasláno: 7. 7. 2010, 22:41:21 · Upravil/a: H13
Ofi:
já jsem zvyklý z Javy na singletony... Já jsem na to zvyklý z PHP :-) ... nedělám nějak zvlášť velké projekty, takže jsem zatím nelitoval toho, že jsem pro něco použil singleton :-) Pokud ti to vyhovuje, tak bych to neměnil ... |
||
Ofi Profil |
#19 · Zasláno: 8. 7. 2010, 15:30:51
reaguji na H13:
„nedělám nějak zvlášť velké projekty, takže jsem zatím nelitoval toho, že jsem pro něco použil singleton :-)“ nápodobně :) měnit to taky nebudu, ale přečíst si o tom názory druhých můžu, tomu se nebránim a třeba se mi to v budoucnu taky bude hodit :) |
||
Časová prodleva: 14 let
|
0