Autor | Zpráva | ||
---|---|---|---|
daewoo Profil * |
#1 · Zasláno: 12. 7. 2012, 21:52:50
Zdravím,
autoloading řeším následovně (je to úryvek, vnitřek stejně není příliš podstatný): function __autoload($jmeno_tridy) { $soubor = $jmeno_tridy.".class.php"; if(!file_exists($soubor)) { throw new Exception("Knihovna ".$soubor." neexistuje.", 5); } require_once($soubor); } Při vytváření nové instance se __autoload správně zavolá, pokud však chci zavolat prvně statickou metodu, např.: Lokalizace::nacti(); __autoload se nezavolá (to přesně já nechci) a parser vypíše chybovou hlášku o neexistenci třídy Lokalizace. Možná špatně hledám, ale nikde jsem nenašel zmínku o tom, zda je toto chování standardní nebo nikoliv. Můžete mi říct k problému něco bližšího? Děkuji. |
||
Tori Profil |
#2 · Zasláno: 12. 7. 2012, 22:03:23
daewoo:
Zkoušela jsem a chyba se mi neprojevila, autoloader se pokoušel načíst tu třídu. Není problém s názvem souboru? (malá/velká písmena, taky je jistější používat absolutní cesty k souboru) |
||
Keeehi Profil |
#3 · Zasláno: 12. 7. 2012, 22:04:09
Mě toto žádnou chybu nehlásí
cokoliv.php <?php function __autoload($jmeno_tridy) { $soubor = $jmeno_tridy.".php"; if(!file_exists($soubor)) { throw new Exception("Knihovna ".$soubor." neexistuje.", 5); } require_once($soubor); } a::nacti(); a.php <?php class a { static function nacti() {echo 1;} } A výsledkem je 1. Nemůže být problém třeba s namespace? |
||
daewoo Profil * |
#4 · Zasláno: 12. 7. 2012, 22:20:45 · Upravil/a: daewoo
Chyba byla na mé straně, omlouvám se. Avšak jeden problém jsem vyřešil, druhý se objevil. :-) V __autoload funkci mám dále ještě zabudovanou kontrolu verze souboru/modulu. Neměl jsem správné číslo a tak se z ní zavolala Exception výjimka. Potud je vše v pořádku. Leč, co mě obvzláště zaujalo, je, že namísto toho, aby se v try bloku, kde je Lokalizace:nacti() volaná, výjimka zachytila v catch(Exception ...), což se normálně jindy děje, a dále zpracovala, se vypíše rovnou chybová hláška parseru. To mě prvně zmátlo a nutno říci, že mate nadále. :-) V tuto chvíli se tak volá druhá výjimka. Nechť:
function __autoload($jmeno_tridy) { $soubor = $jmeno_tridy.".php"; if(!file_exists($soubor)) { throw new Exception("Knihovna ".$soubor." neexistuje.", 5); } ... if($verze != VERZE) { throw new Exception("Knihovna ".$soubor." není se systémem kompatibilní.", 5); } require_once($soubor); } try { Lokalizace::nacti(); } catch(Exception $vyjimka) { die($vyjimka->GetMessage()); } Ještě dodám, že tady v kódu sice vypisuju přímo zprávu té výjimky, u sebe ale ne. |
||
Keeehi Profil |
daewoo:
Co máš za verzi PHP? Viz první poznámka. EDIT: Tak v tomto případě na tom nezáleží a prostě to se statickými metodami nefunguje. Bylo to ohlášeno jako chyba, následně prohlášeno, že je to tak správně a pak se tam zase hádají. Můžeš se připojit do diskuse a snažit se je přesvědčit, aby to opravili. Nic víc s tím asi neuděláš. Osobně to také vidím na bug a to zdůvodnění, že to tak není se mi nelíbí. |
||
daewoo Profil * |
#6 · Zasláno: 12. 7. 2012, 22:35:43 · Upravil/a: daewoo
Keeehi:
Verzi 5.3.8 Keeehi: Tak to je síla... Každopádně díky za pomoc, alespoň vím na čem jsem. |
||
daewoo Profil * |
#7 · Zasláno: 13. 7. 2012, 07:21:22
Na závěr dodám, že je možné chybu obejít takto:
$class = "Lokalizace"; $class::nacti(); |
||
Časová prodleva: 12 let
|
0