2013-04-10 38 views
0

所以我使用spl_autoload_register来加载我的类。不过,我有这样的结构,我的课:PHP - 在子文件夹中使用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吧?如果是这样的话?或者有更好的方法来做到这一点?

+0

@rid我可以很容易地得到包含的类文件就好了,问题是当我调用类名,它调用任何我使用的名称。因此,如果我使用了module_Module(),那么它的期望类module_Module()就是一个类名。除非你说我可以在我登记的功能里面启动这个类? – John 2013-04-10 23:59:10

回答

1

不是说你应该做的,但是在PHP-土地常见的模式是文件名中的使用情况,以及和不添加的东西一样_classclass.Module.php

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

在PHP 5.2(没有namespace支撑位),然后你用_工作强调:

class Modules_Module 
{ 
} 

所以这是它是如何正常进行。 不是说你必须这样做。你也可以按你的意愿解决。但是人们也应该知道这个更常见的模式,因为它有助于阅读/导航第三方源代码。

+0

+1。这也是我的经验,比“php namespacing”更好。 – 2013-04-11 00:16:16

0

基本就是这样。

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

这样做意味着每次添加或修改类时都必须更新类映射,这是自动化的主要候选项。看看使用Composer的autoload functionality,它可以根据需要做到这一点,并自动生成自动加载代码。作曲家非常好,即使忽略其90%的功能也很有用。

+0

类映射可以工作,但如果您拥有较大的代码库(即使用Symfony框架并清除缓存),则该映射将变得不便。 – 2013-04-11 00:02:10

+0

@MikePurcell:在谈论无法重写的遗留代码时,可以选择笨重的类地图和笨拙的“手动包含所有内容,因为您无法设置自动加载”。无论如何,作曲家可以帮助很大。 – Jon 2013-04-11 00:07:23

0

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

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

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

你也可以使用file_exists来检查一个类的多种可能性,但要记住,这对PHP检查文件系统和试图记住文件去往哪里都有一定的代价。

相关问题