Autor Zpráva
kabax
Profil *
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
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
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 *
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
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
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
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
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
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
připojení k databázi - to chceme mít jen jedno
Jak kdo, jak kdy ...
Ofi
Profil
Mastodont:
Jak kdo, jak kdy ...
příklad?
Lamicz
Profil
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
Cache v SQLite, data jinde.
Nox
Profil
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
reaguji na Lamicze, Mastodonta:
dík za příklady :) to mě nenapadlo :)
Joker
Profil
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
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
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
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 :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0