Как и большинство веб-разработчиков в наши дни, я полностью наслаждаюсь преимуществами надежной архитектуры MVC для веб-приложений и сайтов. При выполнении MVC с PHP автозагрузка, очевидно, очень удобна.
Я стал поклонником spl_autoload_register
по сравнению с простым определением одной функции __autoload()
, поскольку это, очевидно, более гибко, если вы используете разные базовые модули, каждый из которых использует свою собственную автозагрузку. Тем не менее, я никогда не чувствовал себя прекрасно в отношении функций загрузки, которые я пишу. Они включают много проверок строк и сканирование каталогов для поиска возможных классов для загрузки.
Например, допустим, у меня есть приложение, базовый путь которого определен как PATH_APP
, и простая структура с каталогами с именами models
, views
и controllers
. Я часто использую структуру именования, в которой файлы с именами IndexView.php
и IndexController.php
находятся внутри соответствующего каталога, и модели обычно не имеют конкретной схемы по умолчанию. Я мог бы иметь функцию загрузчика для этой структуры, как эта, которая регистрируется с spl_autoload_register
:
public function MVCLoader($class)
{
if (file_exists(PATH_APP.'/models/'.$class.'.php')) {
require_once(PATH_APP.'/models/'.$class.'.php');
return true;
}
else if (strpos($class,'View') !== false) {
if (file_exists(PATH_APP.'/views/'.$class.'.php')) {
require_once(PATH_APP.'/views/'.$class.'.php');
return true;
}
}
else if (strpos($class,'Controller') !== false) {
if (file_exists(PATH_APP.'/controllers/'.$class.'.php')) {
require_once(PATH_APP.'/controllers/'.$class.'.php');
return true;
}
}
return false;
}
Если после этого он не найден, возможно, у меня есть другая функция для сканирования подкаталогов в каталоге моделей. Однако все операции if / else-проверки, проверки строк и сканирования каталогов кажутся мне неэффективными, и я хотел бы улучшить их.
Мне очень любопытно, какие стратегии именования файлов и автозагрузки могут использовать другие разработчики. Я специально ищу хорошие методы для эффективной автозагрузки, а не альтернативы автозагрузке.