ФорумПрограммированиеПыхнуть хотите?Готовые решения → Ещё одна реализация autoload

Ещё одна реализация autoload

  • phpdude

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

    Spritz 26 октября 2010 г. 12:50, спустя 35 минут 53 секунды

    throw new LoaderException("Loader: library '$name' not found");

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

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

    фабричный реестр?)
    Сапожник без сапог
  • soul

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

    Spritz 26 октября 2010 г. 13:43, спустя 52 минуты 35 секунд


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


    ну а что тогда делать? не игнорить же


    фабричный реестр?)


    вот от него я и избавился, сделав автолоад.
  • soul

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

    Spritz 27 октября 2010 г. 6:09, спустя 16 часов 26 минут 17 секунд

    если посмотреть на рзличные либы в сети, например орм, то там вызываются классы, лежащие на пятом уровне вложенности либы. например класс field в /orm/orm/field/, но это выходит libs/*/*/*/*.php, то есть без кеширования искать файлы для каждого уровня это задница {+++33+++} а еще названия файлов/классов могут совпадать
  • soul

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

    Spritz 27 октября 2010 г. 6:19, спустя 9 минут 15 секунд


    static public function init() {

    $files = array_merge(glob(SYSPATH.'libs/*/*/*/*.php'),
    glob(SYSPATH.'libs/*/*/*.php'),
    glob(SYSPATH.'libs/*/*.php'),
    glob(SYSPATH.'libs/*.php'),
    glob(APPATH.'libs/*/*/*/*.php'),
    glob(APPATH.'libs/*/*/*.php'),
    glob(APPATH.'libs/*/*.php'),
    glob(APPATH.'libs/*.php')
    );
    echo &#39;<pre>&#39;;print_r($files);echo &#39;</pre>&#39;;
    }


    выходит вот так, находит 39 файлов, увеличивает время выполнения с 0,00500 до 0,008616 c
  • soul

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

    Spritz 27 октября 2010 г. 7:47, спустя 1 час 28 минут 20 секунд

    тут никак маску не применить, эти константы содержат длинные пути


    static protected $store = array();

    static public function init() {

    $files = array_merge(glob(SYSPATH.&#39;libs/*/*.php&#39;, GLOB_NOSORT),
    glob(SYSPATH.&#39;libs/*.php&#39;, GLOB_NOSORT),
    glob(APPATH.&#39;libs/*/*.php&#39;, GLOB_NOSORT),
    glob(APPATH.&#39;libs/*.php&#39;, GLOB_NOSORT)
    );

    foreach ($files as $file) {
    $class = basename($file, &#39;.php&#39;);
    self::$store[$class] = $file;
    }
    }

    static public function auto_load($classname) {

    $classname = strtolower($classname);

    if (array_key_exists($classname, self::$store)) {
    require_once(self::$store[$classname]);
    }
    }


    без кеширования пока вышло так
  • soul

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

    Spritz 27 октября 2010 г. 9:57, спустя 2 часа 9 минут 46 секунд

    а что если вместо автозагрузки прописать include_path?? {+++106+++} set_include_path(get_include_path().&#39;:путь:другой_путь:третий_путь&#39;);
  • soul

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

    Spritz 28 октября 2010 г. 10:14, спустя 1 день 17 минут

    так что вы думаете об этом, форумчане?
  • rider-sx

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

    Spritz 29 октября 2010 г. 7:06, спустя 20 часов 52 минуты 7 секунд

    В Yii нравится как реализованно, все стандартные классы прописаны как алиасы array(&#39;CComponent&#39; => &#39;path/to/component/class&#39;), автолоадер просто проверяет есть ли в списке подключаемый класс если есть хватает его путь и подключает)
  • Dimezis

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

    Spritz 18 августа 2012 г. 9:08, спустя 659 дней 2 часа 1 минуту

    Форматирование - процесс удаления все данных!
  • prodigy

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

    Spritz 8 ноября 2012 г. 7:52, спустя 81 день 23 часа 44 минуты


    а что если вместо автозагрузки прописать include_path?? {+++106+++} set_include_path(get_include_path().&#39;:путь:другой_путь:третий_путь&#39;);


    если будут нэймспэйсы в классах, то нихуя не найдется.
    namespace в php >= 5.3 (точно не помню, когда они появились), Symfony/Component/ClassLoader/UniversalClassLoader.php
  • AlexanderC

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

    Spritz 8 ноября 2012 г. 12:52, спустя 5 часов 2 секунды

    Symfony/Component/ClassLoader/UniversalClassLoader.php + 1 - сам пользуюсь, но есть небольшой оверхед,
    профайлер показывает -1 в карму, но можно изменить к лучшему используя ин мемори кеш(хоть апц) и- ПРОФИТ.

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