PHP класс автозагрузки против процедурной функции автозагрузки?

До этого момента я использовал процедурные автономные функции автозагрузки и регистрировал их с помощью spl_autoload_register() для автоматической загрузки моих (обычно) именных классов. Однако в последнее время я заметил, что люди упоминают об использовании классов автозагрузки в сочетании с некоторыми известными PHP-фреймворками.

Почти весь мой код сегодня объектно-ориентированный, но я не вижу преимуществ использования класса "Autoloader" перед базовой функцией в данном случае. А с точки зрения тестируемости, я вполне уверенно использую проверки class_exists() в своих тестах, чтобы убедиться, что процедурные функции правильно загружают файлы.

Итак, у меня три вопроса:

  1. Какие преимущества или особенности (если таковые имеются) могут побудить меня к рефакторингу и использованию полноценного объекта для автозагрузки файлов классов?
  2. Не упускаю ли я каких-то очевидных преимуществ, помимо очевидных особенностей ООП?
  3. Не могли бы вы привести доводы в пользу процедурных или классовых автозагрузчиков?

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;
  }
}

15
задан James 20 June 2015 в 22:18
поделиться