1

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

4

3 回答 3

1

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

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

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

class Modules_Module
{
}

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

于 2013-04-11T00:13:21.977 回答
0

基本上就是这样。

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

采用这种方式意味着您必须在每次添加或修改类时更新类映射,这是自动化的主要候选任务。研究使用 Composer 的自动加载功能,它可以按需执行此操作并自动为您生成自动加载代码。Composer 非常好,即使您无视其 90% 的功能,它也很有用。

于 2013-04-10T23:59:36.593 回答
0

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

不过,保持映射相对简单对人类也很有用 - 这样您就知道要编辑哪个文件。

例如,您可以说所有开始的类都Mod_存在于一个名为的目录classes/modules中,但所有其他类都存在于一个名为classes/general.

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

于 2013-04-11T00:23:46.780 回答