Autor Zpráva
Bertram
Profil
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
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.

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: