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 MyConfiguratoru 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 | 668
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
MyConfiguratoru 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 | 668
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 | 668
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 :)