Как подключать модули, классы, библиотеки?

Духовность™

Продвинутый новичок
Как подключать модули, классы, библиотеки?

Оказалось, проблема очень серьезная на самом деле.
Прописывать явно include - не айс.
Устанавливать include_path для основных директорий - да.

Но когда появляется директория типа modules, содержащая директории controllers, view, templates и i18n, то в результате __autoload начинает принимать такой вид:

PHP:
function __autoload($class_name)
{
    if (preg_match('~(Backend|Frontend)([A-Z][a-z]+)([A-Z][a-z]+)(Controller)~', $class_name, $matches))
    {
        include_once( DIR_MODULES.strtolower($matches[2]).'/controllers/'.$matches[0].'.php' );
    }
    else if (preg_match('~(Backend|Frontend)([A-Z][a-z]+)([A-Z][a-z]+)(View)~', $class_name, $matches))
    {
        include_once( DIR_MODULES.strtolower($matches[2]).'/view/'.$matches[0].'.php' );
    }
    else
    {
        // смотрим в include_path-s
        include_once($class_name.'.php');
    }
}
А как Вы подгружаете свои классы и библиотеки?
 

whirlwind

TDD infected, paranoid
пример чего, фабрики?

PHP:
class Factory extends ClassLoader implements IFactory
{

    function produce($bp)
    {
        $this->loadClass($bp);
        $class = $this->classPrefix . $bp . $this->classSuffix;
        return $this->createInstance($class);
    }
    
    protected function createInstance($class)
    {
        return new $class();
    }

}
 

Духовность™

Продвинутый новичок
whirlwind
Ну это понятно. Ты указываешь в produce имя класса явно и он инстанцируется. А если используется наследование, интерфейсы? То тут явно же не используешь ручную загрузку, __autoload полюбому же надо юзать.

Т.е образно говоря когда мы пишем

PHP:
class A extends B
то с Factory::produce('A') всё понятно. А кто и как находит и подключает класс В?
 

whirlwind

TDD infected, paranoid
Знаешь, я как то никогда не страдал от необходимости ввести пару лишних строк кода, особенно если они повышают читаемость.

-~{}~ 28.08.09 18:41:

PS. мне проще прописать явно, чем тащить автолоад в каждый тест
 

MiksIr

miksir@home:~$
Используем реестр "класс => файл", ну и скрипт, который по дереву файлов его строит.
 

Viktor_Rez

Новичок
У мну все классы наследованы от класса mysql, он в свою очередь наследуется от класса config =)) Ну а все "модули" - формально между нами - файлеги с именем класса в определенном каталоге с префиксом m_* =)
 

point

Новичок
> $this->load->library()

Мега информативный кусок кода

> У мну все классы наследованы от класса mysql, он в свою очередь наследуется от класса config

OMG 0_0

По теме: как говорилось выше, именно классы с логикой (не view, templates etc) лежат в виде "класс => файл". +spl_autoload_register
 

Viktor_Rez

Новичок
point Не понимаю, в моем представлении - модули - это независимые интерфйесы для заполнения и\или генерации контента с возможностью кэшировать кажлый блок.
 

point

Новичок
Наследование -- есть отношенние "является частью". Предполагаю, что класс mysql предназначен для работы с базой данных. Модуль, например, форум не является частью логики работы с БД. Поэтому тут следует применить не наследование, а аггрегацию.

То же самое и конфигом. По всем канонам, нужно применить аггрегацию.
 

Viktor_Rez

Новичок
point - Я писал что"У мну ВСЕ классы наследованы от класса mysql, он в свою очередь наследуется от класса config"
Т.е. ВСЕ классы. У меня фотоальбом тоже класс формально для нас, программистов, является "дочкой" для класса mysql.
А уж как я подключаю классы - это второй разговор =)
 

point

Новичок
Хорошо. Другой пример. Например, нужен класс ImageResizer. Он тоже будет наследоваться от mysql ?
 

Viktor_Rez

Новичок
Да, будет. Иначе где я буду хранить линк на поресайзинын рисунок?

-~{}~ 29.08.09 01:39:

point
Это всегда будет выглядеть, в любых моих модулях, как $this->query("")
Кто ка переопределит ф-ию mysql_query =))
 

findnext

Новичок
а тема была хорошая...
в свою очередь от себя добавлю
то с Factory::produce('A') всё понятно. А кто и как находит и подключает класс В?
чтобы подключить класс B необходимо где то создать например древовидную (модульную) структуру. Я храню такое дерево в XML.
Дерево генерируется на основе данных - просто список классов, каждому классу A можно задать подкласс B. С помощью factory и autoload загружаются необходимые классы - скрипт тупо смотрит на XML есть ли extended класс и если есть то загружает его (класс B) - в противном случае только себя (A). Не знаю как могу лучше объяснить.
 

Viktor_Rez

Новичок
findnext А вот как для клиента эта процедура проимходит? Мне вот например достаточно просто залить по ftp новый модуль... =))
 

MiksIr

miksir@home:~$
findnext
я вот чего не понимаю... зачем нам хранить структуру еще отдельно, если автолоадер все-равно получит запрос на этот класс? Т.е. чем помагает дублирование информации о структуре автолоадеру?

-~{}~ 29.08.09 03:01:

Viktor_Rez, не в обиду... почитайте хорошие книжки ;)
 

Viktor_Rez

Новичок
Я вт только не понимаю, зачем нам усложнть понимание =))

-~{}~ 29.08.09 04:14:

Мы говорим об методе? =)

-~{}~ 29.08.09 04:19:

Т.е. методологии, а как быть в случае модульной системы? Достаточно "согласиться" с формальной точки зрения на "модули" и поехало =))

-~{}~ 29.08.09 04:23:

findnext, конечно, слов нету, зато есь код! =)

-~{}~ 29.08.09 04:29:

MiksIr Без проблем =))

-~{}~ 29.08.09 04:34:

Или так и будем куда нить писать руками очередной "модуль" =)

-~{}~ 29.08.09 04:42:

http://phpclub.ru/talk/showthread.php?s=&threadid=115882&rand=19#quick_reply_form Что есть аутолоадер? На а где же ауто пастер -=))
 
Сверху