| 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: 13 let
|
|||
0