Как и большинство веб-разработчиков в эти дни, я полностью наслаждаюсь преимуществами надежной архитектуры 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-ing, проверка строк и сканирование каталогов кажутся мне неэффективными, и я хотел бы улучшить его.
Мне очень любопытно, какие стратегии наложения имен и автозагрузки могут использовать другие разработчики. Я ищу конкретные методы для эффективной автозагрузки, а не альтернативы автозагрузке.