Vlastní Configurator pro PHP 5.2
- Jan Voráček
- Člen | 90
Chtěl jsem použít vlastní Configurator pro vytváření služeb, ale
bohužel jsem narazil. NConfigurator používá pro přidávání služeb do
Containeru proměnnou __CLASS__
(API),
která i v instanci nějakého MyConfigurator
u vrací
„NConfigurator“. Řešením by bylo místo __CLASS__
použít
get_class($this)
.
Verze pro 5.2 nicméně nejspíš není na GitHubu, takže to píšu alespoň sem.
- Nette: aktuální 2.0beta pro 5.2
- PHP: 5.3.5
Editoval Jan Voráček (25. 11. 2011 14:57)
- bojovyletoun
- Člen | 667
můžeš upřesnit, jak je to s těmi verzemi? Třeba u mě je to OK (get_called_class))) (23.8.2011,5.3) ,ale u verze 5.2 je __CLASS_ . (špatně jsem to asi pochopil) Nebo jde o problém konverze?
PS: get_called_class() je totéž jako get_class($this)?
- Jan Voráček
- Člen | 90
Jde o to, že funkce get_called_class() existuje až od 5.3. Tudíž se
podle mě pro 5.2 zvolila alternativa ve formě magické proměnné __CLASS__,
která funguje dobře až do doby, než Configurator zdědím. Předpisy pro
tovární metody se pak v instanci
MyConfigurator
u vytváří jako:
array('NConfigurator','createServiceMyService');
místo
array('MyConfigurator','createServiceMyService');
Snad jsem to popsal dostatečně :)
Řekl bych ale, že tím hlavním rozdílem z hlediska použití get_called_class() a get_class($obj) je, že get_called_class() ti vrátí název třídy, ve které je volána (tj. i ve statické metodě). Narozdíl od get_class($obj), která vrací název třídy předané instance.
- bojovyletoun
- Člen | 667
Já jen chtěl vědět, ve kterých verzích nette ta chyba je. To vím, jak se chyba projevuje a jeké má důsledky:)
napadá mě možná polořešení- budeš volat
array(self::get_called_class_2(),$name)
, přičemž tuto statickou
metodu budeš definovat ve všech potomcích jako return __CLASS__
,
když už teda se nedá svítit s php5.3
ohledně funkcí
get_class je hloupé… neumí LSB- už jsem to zjistil
Editoval bojovyletoun (25. 11. 2011 22:32)
- Tharos
- Člen | 1030
No, možným řešením je nemít vlastní konfigurátor jako potomka
Nette\Configurator
a jít cestou kompozice. Mně se osvědčil
právě přístup, kdy mám vlastní konfigurátor, který pouze udržuje
instanci Nette\Configurator
a deleguje na ni potřebné věci,
přičemž v neposlední řadě ten vlastní konfigurátor do „hlavního DI
kontejneru“ vkládá vlastní služby (na mechanismu, jak se to děje, až tak
příliš nezáleží).
Pak jsou všechny problémy s nějakým __CLASS__
ta
tam. :)
- Jan Voráček
- Člen | 90
@bojovyletoun: Já bohužel nic nevolám, je to přímo v Nette Configuratoru ;) LSB je v tomhle případě absolutně nepotřebné, jelikož se jedná o konstruktor :)
@Tharos: Jít cestou kompozice samozřejmě můžu,
ale přijdu tak o velice jednoduchý a mně celkem sympatický způsob
vytváření služeb. Jenom kvůli takové prkotině, jako je
__CLASS__
vs. get_class($this)
.
- bojovyletoun
- Člen | 667
s tím LSB jsem to myslel pro sebe, že už vím rozdíl mezi get_called_class() a getclass
ohledně toho polořešení jsem to myslel přímo upravit Configurator.php – v místě s __CLASS__ -poskytne to jakousi modularitu
sakra, taky vám Netbeans vyhazuje Nullpointerexception při zavření kažého souboru?
- Jan Voráček
- Člen | 90
@22: Bohužel je to veřejná zakázka, kde je v podmínkách řečeno, na kterém serveru to poběží. A dožadovat se updatu je jako hučet do stromu. Ani nevíš, jak mě to s**e :)