Drupal如何处理类的自动加载?


10

Drupal如何通过模块处理类的自动加载?例如,如果我有一个“事件”模块,并且声明了一个名为“事件”的类,然后在.info文件中包括了该类文件,该如何注册?

问题是我试图动态获取包含所有已加载类名称的数组。get_declared_classes()不会以这种方式返回我声明的所有类的名称,因此我假设它们以某种方式自动加载。遵循另一个堆栈溢出问题的建议,我尝试使用spl_autoload_functions()获得所有建议,但这也不成功。

有任何想法吗?

Answers:


13

重建模块时,将解析.info文件中列出的所有文件(出于性能原因,仅列表中的更改/新文件是)。

该信息然后存储在{registry}{registry_files}表中。因此,如果要获取所有类或根据给定命名模式的类,则可以查询这些表。


7

Drupal维护一个代码注册表,并将其用于其类的自动加载器。要使用模块的类填充此注册表,应将其文件添加到其.info文件中的files []条目中:

files[] = includes/Foo.inc
files[] = includes/Bar.inc

PHP的类自动加载将确保父类文件也已加载。

将此问题归功于用户Pier-buyle ,有关相同问题,请参见此处的原始答案

希望能有所帮助



3

如果您已将条目添加到.info文件的files []数组中,则必须转到模块管理部分,然后单击“保存配置”。这将使drupal刷新.info信息,并且新条目将被注册。


1

我发现,当我开始运行模块时,在信息文件中声明我的包含文件不会使它们被识别。如果我在文件event.inc中有一个类Event。但在模块中创建对象时,该对象无法识别。我添加线

include_once ('CMatArticleHandler.inc');

在$ variable = new event()之前;线。我在这方面是新手,所以可能还有更多,但到目前为止,它已经奏效了。


1
真不幸的是,人们只是对此表示否决,而没有解释如何避免这样做。我处在相同的情况:Drupal的自动加载器不能始终如一地认识到需要加载文件来获取类。
greggles

添加新类时,需要清除注册表。使用drush进行此操作的一种简单方法是使用以下命令: drupal.org/project/registry_rebuild
stefgosselin 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.