Вы можете зарегистрировать несколько функций автозагрузки, используя spl_autoload_register
вместо одной функции __autoload
. Это рекомендуемый способ.
Если один автозагрузчик смог загрузить файл, следующий в стеке вызываться не будет.
Однако каждый автозагрузчик должен загружать только те классы, для которых он предназначен, поэтому вам нужно проверить это по имени класса и / или с помощью is_file
. По имени класса часто лучше, потому что дикие попытки в файловой системе могут вызвать нагрузку на систему, если ваше приложение растет.
Чтобы не изобретать велосипед, вы могли бы даже использовать уже существующий автозагрузчик, способный работать со стандартом PSR-0 при вызове имени файла. Они часто позволяют зарегистрировать определенное пространство имен в базовом каталоге. В вашем случае это будет означать, что вы должны переименовать и упорядочить файлы в соответствии с соглашением PSR-0 .
Быстрое решение (связано с вашим вопросом):
function __autoload($class_name)
{
$file = sprintf('%sclasses_1/class_%s.php', AP_SITE, $class_name);
if (is_file($file))
{
include $file;
return;
}
$file = sprintf('%sclasses_2/class_%s.php', AP_SITE, $class_name);
if (is_file($file))
{
include $file;
return;
}
}
Как видите, уже есть дублированный код (как у вас). Так что это должно быть только временное решение, так как вы получите все больше и больше дублированных строк для каждого каталога, для которого вы хотите проверить. Если вы решите изменить дизайн, пожалуйста, примите во внимание схему PSR-0, она помогает упростить базу кода и упростить повторное использование других существующих компонентов в мире PHP.
function autoload_class_multiple_directory($class_name)
{
# List all the class directories in the array.
$array_paths = array(
'classes_1/',
'classes_2/'
);
foreach($array_paths as $path)
{
$file = sprintf('%s%s/class_%s.php', AP_SITE, $path, $class_name);
if(is_file($file))
{
include_once $file;
}
}
}
spl_autoload_register('autoload_class_multiple_directory');