Autor Zpráva
daewoo
Profil *
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
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
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 *
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 *
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 *
Na závěr dodám, že je možné chybu obejít takto:

  $class = "Lokalizace";
  $class::nacti();

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: