PHP自动加载器类与过程式自动加载器函数


PHP autoloader class vs. procedural autoloader function?

到目前为止,我已经使用了过程式的独立自动加载器函数,并在spl_autoload_register()中注册了它们,以自动加载(通常)有名称空间的类。不过,最近我注意到有人提到在一些著名的PHP框架中使用自动加载器类。

这些天,我几乎所有的代码都是面向对象的,但是在这种情况下,我并没有真正看到使用类"自动加载器"比使用基本函数有什么优势。在可测试性方面,我觉得在测试中使用class_exists()检查来验证过程函数是否正确加载文件非常好。

所以我的问题是三个:

    什么优势或功能(如果有的话)可能会影响我重构东西,并开始使用一个完整的对象来自动加载类文件?在这里,除了明显的OOP特性之外,我是否错过了一些明显的优点?
  1. 你能说明程序自动加载器或类自动加载器的情况吗?

下面是我可能使用的典型自动加载函数的一些示例代码。这是元代码,所以不要找错别字。我组织我的目录结构,以便它们反映名称空间。理论上,假设的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;
  }
}

您正在比较函数和方法。那只是语法糖。

除非你有一个基于映射的自动加载器,或者有一个内置的依赖表,否则你不需要任何类级属性来跟踪事物(或者可以求助于静态或全局变量)。运行时可重构性在实践中也不是真正必要的。

你可以用常量等来配置一个过程式自动加载器项目。拥有构造函数属性对于方法实现的重用并没有那么大的好处。

如果您已经使用了框架的另一个主要部分,请使用预构建的,否则就没有什么关系了。

另外,使用一个自动加载器,注册多个名称空间/目录会稍微减少内存,但这不是一个真正的问题。