【问题标题】:PHP autoloader class vs. procedural autoloader function?PHP自动加载器类与程序自动加载器功能?
【发布时间】:2011-12-13 02:36:35
【问题描述】:

到目前为止,我已经使用了程序独立的自动加载器函数并将它们注册到 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;
  }
}

【问题讨论】:

  • 我已从您的问题中删除了“答案”部分,因为它与问题无关。您应该考虑添加自己的答案,它可能会对其他人有所帮助:)

标签: php autoload spl


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回复。我不使用上述框架。我通常更喜欢从各种框架中挑选我最喜欢的功能,我不希望有一个“你应该使用框架”的讨论:) 另外,我目前只使用一个自动加载器..即将用示例代码更新问题.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2012-11-08
    • 1970-01-01
    相关资源
    最近更新 更多