Toto vlákno bylo označeno za vyřešené.
A hoj,
mejme nasledujici PHP kod
<?php
/**
* @package \Core\Other\Help
* @author ...
*/
namespace Core\Other\Help;
use \Core\Error;
/**
* Autoload trida pro automaticke nacitani a vytvareni trid
*/
class Autoload {
/**
* Bajpasuje standardni 'new' - kontroluje, zdali vytvarena trida skutecne existuje...
* @param string $file
* @param string $error_name
* @return $class
*/
static public function _new($class, $error_name = 'Error\EClass\NotExists') {
if(file_exists($class . '.php')) {
return new $class();
} else if($error_name) {
throw new $error_name('File or Class ' . $class . ' does not exists!');
}
}
}
pri spusteni PHP zahlasi
"require_once(Error\EClass\NotExists.php): failed to open stream: No such file or directory"
Pokud mu ale $error_name nahradim rovnou "Error\EClass\NotExist" pak vse probehne bez problem...
Vypada to, jako by PHP neumelo generovat FQN, pokud chci tridu vytvorit pomoci "odkazu".
Nejake navrhy jak to opravit a pritom nepredavat jako parameter FQN?
(FQN - fully qualified name)
Honza
#1 nigaloslav
Máš snad něco proti standardnímu autoloaderu? Proč vynalézáš kolo?
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
#2 Kit
Vzhledem k tomu, ze standardni autoloader pouzivam (SPL_autoload_register).
Standardni autoloader vypada nejak takto:
__autoload($class_name) {
require_once $class_name . '.php';
}
Tady neni problem v autoloaderu ale ve zcestnych PHP namespace...
#3 nigaloslav
Narážel jsem na metodu "_new", která je zbytečná. Vlastně je zbytečná celá třída.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
#4 Kit
Pokud vim, pak jsem se neptal, jestli je dana trida zbytecna nebo ne :). .
Opravdu nikdo nevi, proc PHP neumi stanovit uplny nazev tridy v tomto pripade? Je to "bug" nebo neco delam spatne?
Pro automaticke nahravani trid mam funkci "__autoload" viz. vyse. Cesta k tride je shodna s namespace (tedy pro \A\B\C\Trida mam cestu A/B/C/Trida)
Honza
Ahoj,
reseni jsem nalezl zde
http://www.php.net/manual/en/language.namespaces.dynamic.php#example-226
Proste PHP :D...
#5 nigaloslav
Šlo mi jen o to, že zrušením třídy Autoload zmizí i problém.
Odpověď na otázku zní: Děláš to blbě.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
#7 Kit
?????????????????
Tady vubec nejde o to, k cemu dana tida slouzi, ale o to, jak se PHP chova k 'namespace'! Proboha! Je to kus osekaneho kodu ktery je vytrzen z kontextu!!!!!!!!!!!!!!!!!!!!!!!!!!!~!
Kdyz vytvorim tridu se jmenem "\Moje\Mila\Velka\Trida" a pote jinde v kodu pouziji
use Moje\Mila;
$var = 'Mila\Velka\Trida'; $_t = new $var();
pak dostanu hlasku, ktera je uvedena v mem prvnim prispevku. Coz mi proste a jednoduse prijde zvlastni...
Zjistit počet nových příspěvků
Přidej příspěvek
Uživatelé prohlížející si toto vlákno Uživatelé on-line: 0 registrovaných, 17 hostů