До этого момента я использовал процедурные автономные функции автозагрузки и регистрировал их с помощью spl_autoload_register() для автоматической загрузки моих (обычно) именных классов. Однако в последнее время я заметил, что люди упоминают об использовании классов автозагрузки в сочетании с некоторыми известными PHP-фреймворками.
Почти весь мой код сегодня объектно-ориентированный, но я не вижу преимуществ использования класса "Autoloader" перед базовой функцией в данном случае. А с точки зрения тестируемости, я вполне уверенно использую проверки class_exists() в своих тестах, чтобы убедиться, что процедурные функции правильно загружают файлы.
Итак, у меня три вопроса:
UPDATE
Ниже приведен пример кода для типичной функции автозагрузки, которую я мог бы использовать. Это метакод, так что не ищите опечаток. Я организую структуры каталогов так, чтобы они отражали пространства имен. Гипотетическая функция explode_namespaces()
теоретически может быть включена в класс как статический метод наряду со статическим методом autoload()
, так что это одно преимущество. Возможно, было бы чище объединить эти разрозненные "полезные" функции как методы в одном классе.
function autoload($class_name)
{
$root = APP_LIBS; // a directory path constant set at config time
if ($namespaces = explode_namespaces($class_name)) {
$domain = array_shift($namespaces);
$root .= "/$domain/";
$class_name = array_pop($namespaces);
$directories = array();
foreach ($namespaces as $directory) {
$directories[] = $directory;
}
$root .= implode($directories, '/');
}
$file = "$root/$class_name.php";
if (file_exists($file)) {
include $file;
}
}