2011-12-13 72 views
15

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

现在几乎所有的代码都是面向对象的,但在这个例子中,我并没有看到在基本函数中使用类“Autoloader”的好处。而在可测试性方面,我感觉在我的测试中使用class_exists()检查相当不错,以验证过程函数能够正确加载文件。

所以我的问题有三个:

  1. 什么优势或者特点(如果有的话)可能会动摇我重构的东西,并开始使用一个完全成熟的对象自动加载的类文件?
  2. 我在明显的面向对象特性之外缺少一些明显的优势吗?
  3. 您可以为程序或类自动加载程序创建一个案例吗?

UPDATE

下面是一个典型的自动加载功能,我可能会运用一些示例代码。它是元编码,所以不要找错别字。我组织我的目录结构,以便镜像命名空间。理论上,假设的explode_namespaces()函数可以作为静态方法与类中的静态方法一起使用,所以这是一个好处。将这些不同的“效用”函数作为一个类中的方法结合起来可能会更清洁。

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

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

回答

4

您正在比较函数与方法。这只是句法糖。

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

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

0

使用预置的一个,如果你已经使用框架的另一个重要组成部分,其他明智它其实并不重要。

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

+0

感谢您的答复。我不使用这个框架。我通常更喜欢樱桃从各种框架中选择我最喜欢的功能,我不打算有一个“你应该使用框架”的讨论:)另外,我目前只使用一个自动加载器..关于用示例代码更新问题。 – rdlowrey