PHP — использование spl_autoload_register с подпапками

Поэтому я использую spl_autoload_register для загрузки своих классов. Однако у меня есть эта структура для моих классов:

classes
    classfolder
       classfile

Поэтому обычно, когда я включал их, я делал это:

include('classes/modules/module_class.php');

Теперь, используя spl_autoload_register, как мне обрабатывать подпапки? У меня нет возможности перейти на php 5.3, чтобы использовать пространства имен, нужно ли мне делать что-то подобное?

$module = new modules_Module();

Затем функция, которую я регистрирую с помощью spl_autoload_register, взрывает _ и использует первую часть как папку класса, а вторую часть как метод класса. Но тогда мне пришлось бы изменить имя класса на modules_Module, верно? Если да, то нормально? Или есть лучший способ сделать это?


person John    schedule 10.04.2013    source источник
comment
@rid Я могу легко включить файл класса, проблема в том, что когда я называю имя класса, оно вызывает имя того, что я использую. Итак, если бы я использовал new module_Module(), он ожидал имя класса с module_Module(). Разве вы не говорите, что я могу инициировать сам класс внутри функции, которую я регистрирую?   -  person John    schedule 11.04.2013


Ответы (3)


Не говорю, что вы должны это делать, но общий шаблон в PHP-стране — использовать регистр в именах файлов, а не добавлять такие вещи, как _class или class.Module.php:

include('classes/Modules/Module.php');

В PHP 5.2 (без поддержки namespace) вы затем работаете с подчеркиванием _:

class Modules_Module
{
}

Так вот как это обычно делается. Не говорю, что вы должны делать это именно так. Вы также можете просто решить, как хотите. Но следует также знать об этом более распространенном шаблоне, поскольку он помогает читать/навигацию по стороннему исходному коду.

person M8R-1jmw5r    schedule 11.04.2013
comment
+1. Это тоже мой опыт, и он работает лучше, чем пространство имен php. - person Mike Purcell; 11.04.2013

В основном это все.

В дополнение к пространствам имен (которые вы не можете использовать) и соглашениям об именах для имен классов (которые потребуют от вас переименования всех ваших классов) единственный другой разумный вариант — построить карту классов: массив, который сопоставляет имена классов с полным путем файла, который их определяет.

Такой путь означает, что вам придется обновлять карту классов каждый раз, когда классы добавляются или изменяются, и эта задача является первым кандидатом на автоматизацию. Попробуйте использовать функции автозагрузки Composer, он может делать это по требованию и генерировать автозагрузку код для вас автоматически. Composer настолько хорош, что полезен, даже если вы игнорируете 90% его функций.

person Jon    schedule 10.04.2013
comment
Карта классов будет работать, но она становится громоздкой, если у вас большая база кода, то есть вы используете фреймворк Symfony и очищаете кеш. - person Mike Purcell; 11.04.2013
comment
@MikePurcell: Когда речь идет об устаревшем коде, который нельзя переписать, это выбор между громоздкой картой классов и громоздким ручным включением всего, потому что вы не можете настроить автозагрузку. В любом случае Composer может очень помочь. - person Jon; 11.04.2013

Пока ваши файлы организованы таким образом, что вы можете перейти от имени класса к имени файла, вы можете реализовать свою функцию автозагрузчика так, как вам нравится. Ваша функция автозагрузки не должна просто превращать имя класса в путь к каталогу: ее работа состоит в том, чтобы просто взять имя класса и include нужный файл, если это вообще возможно.

Тем не менее, относительно простое сопоставление полезно и для людей, чтобы вы знали, какой файл редактировать.

Например, можно сказать, что все классы, начинающиеся с Mod_, находятся в каталоге с именем classes/modules, а все остальные — в каталоге с именем classes/general.

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

person IMSoP    schedule 11.04.2013