Autor | Zpráva | ||
---|---|---|---|
Bertram Profil |
#1 · Zasláno: 8. 1. 2012, 12:10:35 · Upravil/a: Bertram
Ahoj, prosím o kritiku třídy, abych mohl napravit co dělám špatně.
Třída zatím neřeší víc tříd/rozhraní v jednom souboru, ale zatím jsem nepřišel na to, proč mi funkce token_get_all nevrací pro složené závorky pole včetně konstant, ale pouze string dané závorky. A o tom jak správně vytvářet cache vím také velmi málo, tak je to prozatím takto, než na to příjdu a vyčlením k tomu samostatnou třídu. S tím samozřejmě suovisí i to, kdy a jak cache invalidovat. Také omluvte mou angličtinu, která vlastně vzniká translátorem :) Za jakoukoli radu/názor předem děkuji. Vloženo mezi pre/pre ,ale přesto neobarveno, když jsem to zkoušel jako další příspěvek v již založeném tématu, který jsem omylem odeslal, tak obarvení bylo v pořádku. oprava: neobarvuje se náhled při vytváření nového příspěvku, přesněji mě se neobarvuje. <? php /** * class Autoloader * Třída pro automatické načítání tříd/rozhraní * @author Bertram */ namespace Trebor\Loader; class AutoLoader { /** * @var array cesty k adresářům k hledání tříd a rozhraní */ private static $dirToSearch = array(); /** * @var array asociativní pole třída/cesta */ public static $classes = array(); /** * načtení případné cache * registrace autoloaderu */ public function __construct() { self::$classes = @unserialize(file_get_contents(realpath('../temp/Loader/classes'))); spl_autoload_register(array($this, 'load')); } /** * @param string $class Třída/rozhraní k nalezení */ public function load($class) { if (empty(self::$classes)) { foreach (self::$dirToSearch as $dir) { $this->searchClassInDir($dir); } $this->createCache(); } if (isset(self::$classes[$class])) { require_once(self::$classes[$class]); } else { throw new \ClassNotFoundException("Class \"$class\" not Loaded"); } } /** * @param string $dir cesta k adresáři pro hledání tříd/rozhraní */ public function addDirectory($dir) { if (is_dir(realpath($dir))) { self::$dirToSearch[] = $dir; } else { throw new \DirectoryNotFoundException("Directory \"$dir\" not found."); } } private function searchClassInDir($dir) { $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir, \FilesystemIterator::SKIP_DOTS), \RecursiveIteratorIterator::SELF_FIRST); foreach ($iterator as $item) { if ($item->isDir()) { $this->searchClassInDir($item); } elseif ($item->isFile()) { $class = $this->scanFile($item); if ($class) { self::$classes[$class] = $item->__toString(); } } } } /** * * @param string $filename cesta k souboru k nalezení tříd/rozhraní * @return string název třídy/rozhraní včetně NS nebo false */ private function scanFile($filename) { $fileToken = token_get_all(file_get_contents($filename)); foreach ($fileToken as $key => $token) { if ($token[0] == T_CLASS OR $token[0] == T_INTERFACE) { $name = $fileToken[$key + 2][1]; } if ($token[0] == T_NAMESPACE) { $_key = $key + 2; $namespace = $fileToken[$_key][1]; while ($fileToken[$_key + 1][0] === T_NS_SEPARATOR) { $namespace .= $fileToken[$_key + 1][1]; // přidání oddělovače namespace $namespace .= $fileToken[$_key + 2][1]; // název "následovaného" namespace $_key++; } } } if (isset($name, $namespace)) { return $namespace . "\\" . $name; } elseif (!isset($name)) { return FALSE; } elseif (!isset($namespace) AND isset($name)) { return $name; } } /** * Uloží výsledek prohledávání na disk */ private function createCache() { @file_put_contents('../temp/Loader/' . 'classes', serialize(self::$classes)); } } |
||
Tori Profil |
#2 · Zasláno: 8. 1. 2012, 21:49:27
Bertram:
„neobarvuje se náhled“ Zkuste buď vyhodit mezeru mezi <? a php, anebo rovnou celý ten otevírací tag. Když ho jush vidí, tak předpokládá PHP vnořené do HTML, bez něj by snad mohl tipnout čistě PHP. |
||
Časová prodleva: 12 let
|
0