PHP fóra: Builder | JakPsatWeb | Webtrh
Nejste přihlášen(a)
zdravim mám tu jeden kosmetický problém mám základní singletonovou třídu od které dědí ostatní a mám ji patřičně okomentovanou PHPDoc komentářema abych mohl jednoduše vygenerovat API a aby mě IDE napovídalo. Ale mám tu jeden problém který souvisí s dědičností. Mějme třídu:
/**
* ....
*/
abstract class Singleton
{
/** @var array*/
private static $instances = array();
private function __construct() {}
/**
* Get instance of Singleton
*
* @return Singleton
*/
final public static function getInstance()
{
$class = get_called_class();
if (!isset(self::$instances[$class]))
self::$instances[$class] = new $class;
return self::$instances[$class];
}
/**
* Bar
*
* @param int $x
* @return int
*/
public function bar($x)
{
return $x;
}
}
//Ještě si uděláme jejího potomka
class FooClass extends Singleton
{
/** @var FooClass */
protected static $instance;
/**
* Bar
*
* @param int $x
* @param int $y
* @return int
*/
public functipn bar($x, $y)
{
return $x+$y;
}
}
No a probém je jednoduchý když dám těď pomocí PHPDoc vygenerovat API
nebo když budu chtít použít třídu FooClass v IDE. tak mě po
napsání FooClass::getInstance()->bar bude nabízet popis
k metodě bar z Singleton. Takže se ptám jak
docílit toho aby mě byl zobrazen správný popis metody bar?
EDIT: Toto pro mě není řešení (pak totiž nemusím od
třídy Singleton vůbec dědit):
/**
* Get instance of FooClass
*
* @return FooClass
*/
public static function getInstance()
{
return parent::getInstance();
}
Editoval vrtak-cz (24. 11. 2009 0:32)
„Nastala chyba která neměla nastat“ aneb „Když se chce všechno jde.“
Offline
a nezkoušel jsi @return self ? na 99% to nepůjde, ale zkusit
se to musí :]
Z Javy do PHP nikdy nic dobrého nepřišlo. / http://twitter.com/paranoiq
Offline
Pokud pomineme, že FooClass::getInstance() stejně vrátí
BaseClass, tak chápu, o co ti jde, ale tohle phpDoc ani IDE
zatím neumí.
Offline
Pokud pomineme, že by ten kód vyhodil parse error protože tam bylo „functin“ misto „function“, tak díky alespoň vím že mám poslat feature request.
PS: kód jsem opravil
Editoval vrtak-cz (3. 11. 2009 0:27)
„Nastala chyba která neměla nastat“ aneb „Když se chce všechno jde.“
Offline
Moc nerozumiem tvojmu navrhu, pokial viem tak singleton znamena ze mozes urobit iba jednu instanciu danej classy. Vyuziva sa to hlavne v programovacich jazykoch kde pracujes s threads – takze mozes urobit synchronizovanu metodu. Napr ak by to v php fungovalo tak si vytvoris singleton classu na citanie suboru. Ta metoda co cita subor by bola synchronizovana, to znamena ze iba jedna thread ju moze navstivit a az ked ju tato thread opusti tak ju moze dalsia navstivit. Synchronizovanie funguje na instanciu, takze ak by si mohol vytvorit viac instanci tak by ta synchronizacia bola na nic – lebo by rovnaky file mohlo navstivit viac threads kvoli roznym instanciam.
Takze v tvojom pripade to singleton asi nieje pretoze rozsirujes triedu – takze mozes mat instanciu triedy A a takisto instanciu triedy B, ak mas metodu napr. getSth(A $a) tak v nej mozes pouzit aj instanciu triedy A a aj B – dve rozne instancie.
Nepozeral som si tvoj kod podrobne, takze sa mozno mylim, ale ja ked robim singleton tak dam vsetky metody do vnutra tej singleton triedy (pretoze robim instanciu vzdy tej jednej triedy – nevidim preco by som to mal rozdelit do viac tried) a urobim tuto triedu final – takze to bude naozaj singleton (nikto ju nemoze rozsirit a tym padom vytvorit dalsiu instanciu).
Offline
Asi jsi to malinko nepochopil tohle je BaseClass tj. class kterej sám o sobě nemůže být instancován ale zařiruje vsechno co je pro singletoní třídu v PHP potřeba. To znamená že pak už u jednotlivejch singletoních tříd nemusím psát tu omáčku kolem aby z ní byl singleton. (prostě DRY)
„Nastala chyba která neměla nastat“ aneb „Když se chce všechno jde.“
Offline
No nevidim tam v tej zdedenej triede ani volanie parent construct, tak neviem ako sa ti urobi instancia tej hlavnej triedy, je to nieco nove v php 5.3? A co sa tyka „tohle je base class ktora nemoze by instancovana“ – to si ako dosiahol? lebo nevidim ze by ta trieda bola abstract + instancia je drzana v protected instance variable, takze moze byt kludne zmenena ak ju ty (alebo niekto iny co pouziva tvoj kod) zmeni (umyselne alebo neumyselne). Nechcem sa hadat, ako som aj napisal moc dobre nechapem tomu tvojmu kodu – tak som aj vysvetlil ako podla mna funguje singleton, takze by som sa rad dozvedel ako si to myslel (bez nejakych zbytocnych hadok).
Offline
Původně byl dotaz na něco úplně jiného a tak nebyl kód 100%. Teď jsem ho opravil a měl by být korektní. Snad už chápeš.
EDIT: něco více jsem k tomu psal zde: http://www.vrtak-cz.net/…keho-objektu
Editoval vrtak-cz (24. 11. 2009 0:35)
„Nastala chyba která neměla nastat“ aneb „Když se chce všechno jde.“
Offline
No vyzera to zaujimavo ale kedze v php sa constructor nevola automaticky tak mi nic nebrani napisat:
<?php
class FooClass extends Singleton {
public function __construct() {}
}
?>
a v tom pripade mi nic nebrani vytvorit instancie triedy FooClass, alebo volat zdedenu staticku metodu, takze by to singleton nebol.
Toto sa moze stat neumyselne, ak niekto zobere po mne kod a chce volat nejake metody (alebo nieco) pri instanci, tak prvu vec co urobi je napise constructor, potom si niekto dalsi pozrie jeho kod a vidi public constructor tak vytvori instanciu s pouzitim new.
Editoval pete (24. 11. 2009 11:06)
Offline
Nevím o tom že by se to dalo v PHP řešit lépe. Viz odkazovaný blogpost a v něm je odkaz na davidův http://phpfashion.com/…ingleton-zlo . Pokud víš o lepším řešení v PHP tak sem s ním. Jinak konstrukor je private takže ho nepřekreješ. Je fakt že jsem ho mohl ještě hodit final.
„Nastala chyba která neměla nastat“ aneb „Když se chce všechno jde.“
Offline
mne sa ten napad paci, ale ako si uz spomenul tak v php veci nefunguju ako by si chcel, preto ked robim singleton tak mam vsetko v jednej triede (nededim), mam private constructor (clone takisto) a trieda je final, takze aj ked pisem ovela viacej si mozem byt isty ze to je singleton. Ako si spomenul konstruktor si mohol dat final a ten moj kod by nefungoval, ale tym padom vsetky tvoje sub-triedy prichadzaju o moznost mat konstruktor. Ja osobne si myslim ze singleton nieje moc potrebny v php aplikaciach, preto som aj spomenul priklad vyssie. Singleton sa hodi napr. ak mas system na servri a pristupuju na neho ludia z terminalov. Tak si urobis facade desing pattern a coordinating class bude singleton, takze si mozes kontrolovat threads – nestane sa ze dva terminaly mozu zmenit naraz nejake veci a popritom o jeden druheho zmene nevediet. Kedze mas iba jednu instanciu tak si si isty ze vsetky threads pracuju iba s touto instanciou a mas nad nimi kontrolu – mozes synchronizovat metody. (Alebo vyssie spomenuty priklad s citanim suboru). Takze singleton je zlo ak sa pouzije tam kde sa nema.
Editoval pete (24. 11. 2009 19:22)
Offline