PHP -对子文件夹使用spl_autoload_register


PHP - Using spl_autoload_register with subfolders

所以我使用spl_autoload_register来加载我的类。然而,我的类有这样的结构:

classes
    classfolder
       classfile

所以通常当我包含它们时,我是这样做的:

include('classes/modules/module_class.php');

现在使用spl_autoload_register我将如何处理子文件夹?我没有能力升级到php 5.3使用名称空间,我需要做这样的事情吗?

$module = new modules_Module();

然后,我用spl_autoload_register注册的函数将_展开,并使用第一部分作为类文件夹,第二部分作为类方法。但我必须把类名改为modules_Module,对吧?如果可以,可以吗?还是有更好的方法?

不是说你应该这样做,但php领域的一个常见模式是在文件名中使用case,而不是添加_classclass.Module.php之类的东西:

include('classes/Modules/Module.php');

在PHP 5.2(不支持namespace)中,您可以使用_下划线:

class Modules_Module
{
}

这就是通常的做法。不是说你必须那样做。你也可以随心所欲地解决。但是你也应该知道这个更常见的模式,因为它有助于阅读/导航第三方源代码。

基本就是这样。

除了名称空间(不能使用)和类名的命名约定(需要重命名所有类)之外,唯一的另一个相同的选择是构建一个classmap:一个将类名映射到定义它们的文件的完整路径的数组。

采用这种方式意味着您必须在每次添加或修改类时更新类映射,这是自动化的主要候选任务。考虑使用Composer的自动加载功能,它可以按需完成此操作,并自动为您生成自动加载代码。Composer是如此之好,即使你忽略了它90%的功能,它也很有用。

只要你的文件以某种方式排列,让你从类名到文件名,你可以实现你的自动加载器功能,但你喜欢。您的自动加载函数不需要仅仅将类名转换为目录路径:它的工作只是获取类名,如果可能的话,include是正确的文件。

保持映射相对简单对人类也很有用——这样你就知道要编辑哪个文件了。

例如,你可以说所有以Mod_开头的类都位于名为classes/modules的目录中,而所有其他类都位于名为classes/general的目录中。

您也可以使用file_exists来检查一个类的多种可能性,但请记住,这对PHP检查文件系统和试图记住文件的位置的人来说都是有代价的。