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

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

  • ivanscm

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

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

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

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

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

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

    include 'autoload.php';

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


    autoload.php

    <?php

    class Autoload
    {
    private $classes_file = '';
    private $classes = array();


    function __construct($autoload = 'cache/autoload')
    {
    $this->classes_file = ROOT_DIR . '/' . $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('#.*(class|interface)\s(\w+)#', $php_file, $classes_list);
    if (count($classes_list) > 2 && 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() && !$file->isDot())
    $this->scanClass($file->getPathname());

    if ($file->isFile() && strtolower(pathinfo($file->getFilename(), PATHINFO_EXTENSION)) == 'php')
    {
    $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 ('self::autoload');
    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ха! hyperoff.ru - качественный хостинг php
  • phpdude

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

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

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

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

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

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

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

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


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

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

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



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


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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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


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

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

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

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

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

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

    капитоны
  • Tekuto

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

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

    Капитошка? :D
    Спустя 96 сек.
  • Sinkler

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

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

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

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

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

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

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

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

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

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

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