Vlastní Configurator pro PHP 5.2

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Jan Voráček
Člen | 90
+
0
-

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 | 667
+
0
-

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)?

Aurielle
Člen | 1281
+
0
-

get_called_class() je funkční až od PHP 5.3.

Jan Voráček
Člen | 90
+
0
-

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 | 667
+
0
-

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
+
0
-

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
+
0
-

@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
+
0
-

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?

22
Člen | 1478
+
0
-

@Voraček: tak přijdeš o to zejmenna kvůli tomu, že vyvíjíš na 5.2 a ne na 5.3 :-)

Jan Voráček
Člen | 90
+
0
-

@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 :)

22
Člen | 1478
+
0
-

tak to pak jo, myslele jsem, že tak děláš dobrovolně… .-)

Lopata
Člen | 139
+
0
-

Pokud Ti to hodně leží v žaludku, dá se to s určitou dávkou sebezapření obejít za použití funkce debug_backtrace, z jejíž výstupu si to celkem jednoduchým regulárem ve vlastní funkci get_called_class vytáhneš.