首页 文章

PHP自动加载器类与程序自动加载器功能?

提问于
浏览
15

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

几乎所有的代码都是面向对象的,但是我并没有看到在这个实例中使用类"Autoloader"优于基本函数的优点 . 在可测试性方面,我觉得在我的测试中使用class_exists()检查来验证程序功能是否正确加载文件 .

So my questions are three:

  • 哪些优点或功能(如果有的话)可能会影响我重构事物并开始使用完整的对象来自动加载类文件?

  • 在明显的OOP功能之外我是否缺少一些明显的优势?

  • 你能为程序或类自动加载器提供案例吗?


UPDATE

下面是我可能使用的典型自动加载功能的一些示例代码 . 它's metacode, so don'吨寻找错别字 . 我组织我的目录结构,以便它们镜像命名空间 . 理论上,假设 explode_namespaces() 函数可以作为静态方法包含在类中的静态 autoload() 方法中,因此这是一个好处 . 将这些不同的"utility"函数组合为单个类中的方法可能更清晰 .

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

2 回答

  • 0

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

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

    您可以创建一个程序自动加载器项目 - 可以使用常量进行配置等 . 具有构造函数属性对于使用方法实现进行重用并不具有重要意义 . 它可能看起来稍微好一些 .

  • 4

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

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

相关问题