PHP - 将spl_autoload_register与子文件夹一起使用

时间:2013-04-10 23:55:09

标签: php spl-autoload-register

所以我使用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吗?如果是这样可以吗?或者有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

不是说你应该这样做,但PHP-land中的常见模式是在文件名中使用大小写,而不是添加_classclass.Module.php之类的内容:

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

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

class Modules_Module
{
}

所以这就是通常的做法。 说你必须这样做。您也可以按照自己的意愿解决问题。但是人们也应该知道这个更常见的模式,因为它有助于阅读/导航第三方源代码。

答案 1 :(得分:0)

基本上就是这样。

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

这样做意味着每次添加或修改类时都必须更新类映射,这是一个自动化的主要候选任务。考虑使用Composer的autoload functionality,它可以按需执行此操作并自动为您生成自动加载代码。 Composer非常好,即使你忽略了90%的功能它也很有用。

答案 2 :(得分:0)

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

保持映射相对简单对人类也很有用 - 所以你知道要编辑哪个文件。

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

您还可以使用file_exists检查一个类的多种可能性,但请记住,这对PHP检查文件系统以及尝试记住文件位置的人都有一定的成本。< / p>