Форум → Программирование → Пыхнуть хотите? → Готовые решения → Ещё одна реализация autoload
Ещё одна реализация autoload
-
Окт. 27, 2010, 5:09 п.п., спустя 16 часов 26 минут 17 секунд
если посмотреть на рзличные либы в сети, например орм, то там вызываются классы, лежащие на пятом уровне вложенности либы. например класс field в /orm/orm/field/, но это выходит libs/*/*/*/*.php, то есть без кеширования искать файлы для каждого уровня это задницаСпустя 33 сек.а еще названия файлов/классов могут совпадать -
Окт. 27, 2010, 5: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 '<pre>';print_r($files);echo '</pre>';
}
выходит вот так, находит 39 файлов, увеличивает время выполнения с 0,00500 до 0,008616 c -
Окт. 27, 2010, 6:47 п.п., спустя 1 час 28 минут 20 секунд
тут никак маску не применить, эти константы содержат длинные пути
static protected $store = array();
static public function init() {
$files = array_merge(glob(SYSPATH.'libs/*/*.php', GLOB_NOSORT),
glob(SYSPATH.'libs/*.php', GLOB_NOSORT),
glob(APPATH.'libs/*/*.php', GLOB_NOSORT),
glob(APPATH.'libs/*.php', GLOB_NOSORT)
);
foreach ($files as $file) {
$class = basename($file, '.php');
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]);
}
}
без кеширования пока вышло так -
Окт. 27, 2010, 8:57 п.п., спустя 2 часа 9 минут 46 секунд
а что если вместо автозагрузки прописать include_path??Спустя 106 сек.set_include_path(get_include_path().':путь:другой_путь:третий_путь'); -
-
Окт. 29, 2010, 6:06 п.п., спустя 20 часов 52 минуты 7 секунд
В Yii нравится как реализованно, все стандартные классы прописаны как алиасы array('CComponent' => 'path/to/component/class'), автолоадер просто проверяет есть ли в списке подключаемый класс если есть хватает его путь и подключает) -
Авг. 18, 2012, 8:08 п.п., спустя 659 дней 2 часа 1 минуту
Форматирование - процесс удаления все данных! -
Ноя. 8, 2012, 7:52 п.п., спустя 81 день 23 часа 44 минуты
а что если вместо автозагрузки прописать include_path??Спустя 106 сек.set_include_path(get_include_path().':путь:другой_путь:третий_путь');
если будут нэймспэйсы в классах, то нихуя не найдется.
namespace в php >= 5.3 (точно не помню, когда они появились), Symfony/Component/ClassLoader/UniversalClassLoader.php -
Ноя. 9, 2012, 12:52 д.п., спустя 5 часов 2 секунды
Symfony/Component/ClassLoader/UniversalClassLoader.php + 1 - сам пользуюсь, но есть небольшой оверхед,
профайлер показывает -1 в карму, но можно изменить к лучшему используя ин мемори кеш(хоть апц) и- ПРОФИТ.
Пожалуйста, авторизуйтесь, чтобы написать комментарий!