15

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

这些天,我几乎所有的代码都是面向对象的,但我并没有真正看到在这个实例中使用“Autoloader”类而不是基本函数的优势。在可测试性方面,我觉得在我的测​​试中使用class_exists()检查来验证程序函数是否正确加载文件感觉很好。

所以我的问题是三个:

  1. 哪些优点或特性(如果有的话)可能会促使我重构事物并开始使用完整的对象来自动加载类文件?
  2. 除了明显的 OOP 功能之外,我是否遗漏了一些明显的优势?
  3. 您能否为程序自动加载器或类自动加载器提供一个案例?

更新

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

2 回答 2

4

您正在将函数与方法进行比较。那只是语法糖。

除非您有基于地图的自动加载器或具有内置依赖关系表的自动加载器,否则您不需要任何类级属性来跟踪事物(或者可以诉诸静态或全局变量)。运行时可重构性在实践中也不是真正的必需品。

您可以使用常量等使程序自动加载器项目可配置。具有构造函数属性对于方法实现的重用并不是那么重要。它可能看起来稍微好一点。

于 2011-12-13T03:08:39.160 回答
0

如果您已经使用了框架的另一个主要部分,请使用预构建的,否则它并不重要。

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

于 2011-12-13T03:06:36.917 回答