#1 2. 11. 2009 16:31

vrtak-cz
NDP guru
Místo: Praha/Ústí nad Orlicí
Registrovaný: 8. 3. 2008
Příspěvky: 981
Web

Singleton + BaseClass + PHPDoc → špatné napovídání

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

 

#2 2. 11. 2009 17:58

paranoiq
Člen
Místo: Tábor
Registrovaný: 14. 11. 2006
Příspěvky: 188

Re: Singleton + BaseClass + PHPDoc → špatné napovídání

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

 

#3 2. 11. 2009 22:20

David Grudl
Administrator
Registrovaný: 8. 2. 2005
Příspěvky: 4249
Web

Re: Singleton + BaseClass + PHPDoc → špatné napovídání

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

 

#4 3. 11. 2009 0:27

vrtak-cz
NDP guru
Místo: Praha/Ústí nad Orlicí
Registrovaný: 8. 3. 2008
Příspěvky: 981
Web

Re: Singleton + BaseClass + PHPDoc → špatné napovídání

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

 

#5 23. 11. 2009 17:51

pete
Člen
Registrovaný: 22. 10. 2009
Příspěvky: 24

Re: Singleton + BaseClass + PHPDoc → špatné napovídání

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

 

#6 23. 11. 2009 19:37

vrtak-cz
NDP guru
Místo: Praha/Ústí nad Orlicí
Registrovaný: 8. 3. 2008
Příspěvky: 981
Web

Re: Singleton + BaseClass + PHPDoc → špatné napovídání

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

 

#7 23. 11. 2009 22:43

pete
Člen
Registrovaný: 22. 10. 2009
Příspěvky: 24

Re: Singleton + BaseClass + PHPDoc → špatné napovídání

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

 

#8 24. 11. 2009 0:34

vrtak-cz
NDP guru
Místo: Praha/Ústí nad Orlicí
Registrovaný: 8. 3. 2008
Příspěvky: 981
Web

Re: Singleton + BaseClass + PHPDoc → špatné napovídání

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

 

#9 24. 11. 2009 10:58

pete
Člen
Registrovaný: 22. 10. 2009
Příspěvky: 24

Re: Singleton + BaseClass + PHPDoc → špatné napovídání

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

 

#10 24. 11. 2009 12:31

vrtak-cz
NDP guru
Místo: Praha/Ústí nad Orlicí
Registrovaný: 8. 3. 2008
Příspěvky: 981
Web

Re: Singleton + BaseClass + PHPDoc → špatné napovídání

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

 

#11 24. 11. 2009 12:51

pete
Člen
Registrovaný: 22. 10. 2009
Příspěvky: 24

Re: Singleton + BaseClass + PHPDoc → špatné napovídání

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

 

Zápatí