ФорумПрограммированиеПыхнуть хотите?Готовые решения → Автолоадер на быструю, ногами не пинать, пожелания и критика

Автолоадер на быструю, ногами не пинать, пожелания и критика

  • ivanscm

    Сообщения: 1251 Репутация: N Группа: Джедаи

    Spritz 22 февраля 2012 г. 10:47

    Пришла идея автолоадер написать. Такой что бы все знал, и ничего не надо было прописывать.
    Решение увидел такое: при запуске первый раз(узнаем существует ли определенный файл), шаримся рекурсивно по каталогам проекта и если это пхп файл, ищем у него классы и интерфейсы(регулярка), пишем в массив вида ключ название класса, значение = путь и название файла. затем этот массив сериализуем и пишем в файл. регистрируем свой автолоад и вуаля. при создании автолоада, читаем файл и у нас массив этот на руках :) автолоад функция просто берет путь с него и инклудит. допиливать нужно дох чего. но как вам идея? хотя может и существует такое.

    придумал по пути с работы домой. пришел, написал, запостил, ушел варить вареники

    использование

    <?php
    define(&#39;ROOT_DIR&#39;, $_SERVER[&#39;DOCUMENT_ROOT&#39;]);
    define(&#39;DEBUG&#39;, TRUE);

    include &#39;autoload.php&#39;;

    $autoloader = new Autoload();
    $autoloader->registerAutoload();
    ?>


    autoload.php

    <?php

    class Autoload
    {
    private $classes_file = &#39;&#39;;
    private $classes = array();


    function __construct($autoload = &#39;cache/autoload&#39;)
    {
    $this->classes_file = ROOT_DIR . &#39;/&#39; . $autoload;
    }

    function existsClasses()
    {
    return file_exists($this->classes_file);
    }

    function readAutoload()
    {
    return unserialize(file_get_contents($this->classes_file));
    }

    function writeAutoload($classes = array())
    {
    return file_put_contents($this->classes_file, serialize($classes));
    }

    function getClassName($file)
    {
    $php_file = file_get_contents($file);
    preg_match_all(&#39;#.*(class|interface)\s(\w+)#&#39;, $php_file, $classes_list);
    if (count($classes_list) > 2 &amp;&amp; isset($classes_list[2][0]))
    {
    return $classes_list[2];
    }
    else
    return FALSE;
    }

    function scanClass($dir)
    {
    $dir_list = new DirectoryIterator($dir);
    foreach ($dir_list as $file)
    {
    if ($file->isDir() &amp;&amp; !$file->isDot())
    $this->scanClass($file->getPathname());

    if ($file->isFile() &amp;&amp; strtolower(pathinfo($file->getFilename(), PATHINFO_EXTENSION)) == &#39;php&#39;)
    {
    $classes_list = $this->getClassName($file->getPathname());
    if ($classes_list !== FALSE)
    foreach ($classes_list as $class_name)
    $this->classes[strtoupper($class_name)] = $file->getPathname();
    }
    }
    }

    function registerAutoload()
    {
    spl_autoload_register (&#39;self::autoload&#39;);
    if (!$this->existsClasses())
    {
    $this->scanClass(ROOT_DIR);
    $this->writeAutoload($this->classes);
    }
    else
    $this->classes = $this->readAutoload();
    }

    function autoload($class_name)
    {
    $class_name = strtoupper($class_name);
    if (isset($this->classes[$class_name]))
    include $this->classes[$class_name];
    }
    }

    ?>
    С возвращением, Пiха!
  • phpdude

    Сообщения: 26617 Репутация: N Группа: в ухо

    Spritz 22 февраля 2012 г. 11:01, спустя 14 минут 5 секунд

    пиздец чото сложно
    Сапожник без сапог
  • kostyl

    Сообщения: 5201 Репутация: N Группа: Джедаи

    Spritz 22 февраля 2012 г. 11:14, спустя 13 минут 12 секунд

    а чем не устраивают готовые решения?
  • ivanscm

    Сообщения: 1251 Репутация: N Группа: Джедаи

    Spritz 22 февраля 2012 г. 11:27, спустя 13 минут 2 секунды


    а чем не устраивают готовые решения?
    что например?
    С возвращением, Пiха!
  • Ivan

    Сообщения: ? Репутация: N Группа: Адекваты

    Spritz 22 февраля 2012 г. 12:20, спустя 52 минуты 35 секунд



    а чем не устраивают готовые решения?
    что например?


    https://github.com/symfony/ClassLoader
    http://symfony.com/doc/2.0/components/class_loader.html
  • kostyl

    Сообщения: 5201 Репутация: N Группа: Джедаи

    Spritz 22 февраля 2012 г. 12:29, спустя 8 минут 59 секунд

    Ivan, ну да, в фреймворках есть дофига компонент хороших, оттестированных гибких и т.п…
  • phpdude

    Сообщения: 26617 Репутация: N Группа: в ухо

    Spritz 22 февраля 2012 г. 12:42, спустя 12 минут 45 секунд

    	public function addSrcPath($srcPath)
    {
    self::$srcPath[] = rtrim(trim($srcPath), &quot;/&quot;);
    }

    public static function autoload($className)
    {
    $regex = &#39;#^[a-z0-9\-_]+$#i&#39;;

    if (!preg_match($regex, $className)) {
    throw new RuntimeException(&quot;Bad class name, supported class named types only by regexp: &quot; . $regex);
    }

    foreach (self::$srcPath as $dir)
    {
    $path = $dir . &quot;/&quot; . str_replace(&#39;_&#39;, &quot;/&quot;, strtolower($className)) . &quot;.php&quot;;
    if (file_exists($path)) {
    /** @noinspection PhpIncludeInspection */
    require_once $path;
    }
    }
    }


    ВСЕ. Большего и не надо. остальное - излишки выебонов, которые в хуй не усрались. Ну если у них есть классмаппинг овервратибл, то можно еще пару ифом ебануть в код и ВСЕ.
    Сапожник без сапог
  • lolcat

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 22 февраля 2012 г. 13:10, спустя 28 минут 15 секунд

    http://php.net/manual/ru/language.oop5.autoload.php а разве это не то же самое?
  • phpdude

    Сообщения: 26617 Репутация: N Группа: в ухо

    Spritz 22 февраля 2012 г. 13:26, спустя 16 минут 31 секунду


    http://php.net/manual/ru/language.oop5.autoload.php а разве это не то же самое?
    ты гений, а ты думал мы тут чтото другое обсуждаем? :D
    Сапожник без сапог
  • Ivan

    Сообщения: ? Репутация: N Группа: Адекваты

    Spritz 22 февраля 2012 г. 13:35, спустя 8 минут 37 секунд

    Автоопределение пути по неймспейсу
    Регистрация путей к неймспейсам
    Регистрация путей к префиксам
  • Sinkler

    Сообщения: 9658 Репутация: N Группа: в ухо

    Spritz 22 февраля 2012 г. 14:01, спустя 25 минут 59 секунд

    капитоны
  • Tekuto

    Сообщения: ? Репутация: N Группа: Адекваты

    Spritz 22 февраля 2012 г. 17:06, спустя 3 часа 4 минуты 50 секунд

    Капитошка? :D {+++96+++}
  • Sinkler

    Сообщения: 9658 Репутация: N Группа: в ухо

    Spritz 22 февраля 2012 г. 17:10, спустя 4 минуты 33 секунды

    о, точно, вот откуда слово это)))
  • Flare

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 22 февраля 2012 г. 18:02, спустя 51 минуту 37 секунд

    ivanscm, если бы я делал свой велосипед, то я бы не сериализировал, а генерил и потом подключал файл с содержанием
    return array(&quot;Bootstrap&quot; => &quot;&quot;, &quot;Moped&quot; => &quot;&quot;)

    через инклуд с массивом в чистом виде, так проще и нагляднее. либо на каждый компонент по такому файлу автолоада, и потом их сливать в один.
  • Flare

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 22 февраля 2012 г. 18:08, спустя 6 минут

    phpdude, можешь объяснить чем твой метод добавлять и хранить папки, где будет проходить через спец метод в масив $srcPath, чем это делать через set_include_path()?

Пожалуйста, авторизуйтесь, чтобы написать комментарий!