所以我使用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,而不是添加_class
或class.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检查文件系统和试图记住文件的位置的人来说都是有代价的。