PHP自动加载类与程序自动加载函数?

PHP自动加载类与程序自动加载函数?,php,autoload,spl,Php,Autoload,Spl,到目前为止,我已经使用了过程独立的自动加载函数,并将它们注册为自动加载(通常)名称空间类。不过,最近我注意到有人提到autoloader类与一些著名的PHP框架结合使用 现在,我几乎所有的代码都是面向对象的,但我并不认为在这个实例中使用类“Autoloader”比使用基本函数有什么好处。在可测试性方面,我对在测试中使用检查来验证过程函数是否正确加载文件感到非常满意 所以我的问题有三个: 什么样的优势或特性(如果有的话)可能会影响我重构东西,并开始使用一个完整的对象来自动加载类文件 除了明显的OO

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

现在,我几乎所有的代码都是面向对象的,但我并不认为在这个实例中使用类“Autoloader”比使用基本函数有什么好处。在可测试性方面,我对在测试中使用检查来验证过程函数是否正确加载文件感到非常满意

所以我的问题有三个:

  • 什么样的优势或特性(如果有的话)可能会影响我重构东西,并开始使用一个完整的对象来自动加载类文件
  • 除了明显的OOP特性之外,我是否错过了一些明显的优势
  • 你能为程序自动加载器或类自动加载器提供一个案例吗

  • 更新

    下面是我可能使用的典型自动加载函数的一些示例代码。这是元代码,所以不要找拼写错误。我组织我的目录结构,以便它们镜像名称空间。理论上,假设的
    explode\u namespace()
    函数可以作为静态方法与类中的静态
    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;
      }
    }
    

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


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

    您正在比较函数和方法。那只是语法上的甜点

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


    您可以使用常量等配置过程自动加载程序项目。对于方法实现的重用,具有构造函数属性并没有太大的好处。它看起来可能只是稍微好一点。

    谢谢您的回复。我不使用上述框架。我通常更喜欢从各种框架中挑选我最喜欢的功能,我不希望有“你应该使用框架”的讨论:)而且,我目前只使用一个自动加载器。。即将用示例代码更新问题。我已从您的问题中删除“答案”部分,因为它与问题实际上无关。你应该考虑添加你自己的答案,它可能会帮助其他人: