非破坏性spl_autoload_register

问题描述:

我想通过spl_autoload_register在我正在开发的wordpress插件中使用类的动态加载,但问题是它不能干预此功能的预先存在的实现。在我最初的尝试:非破坏性spl_autoload_register

// register an autoloader function for template classes 
spl_autoload_register ('template_autoloader'); 

function template_autoloader ($class) { 
    include LG_FE_DIR . "/includes/chart_templates/class.{$class}.php"; 
} 

似乎在加载自己的类,但同时会导致吨,显然是使用spl_autoload_register功能也从其他插件错误的工作。

任何想法?

+0

好吧,我提高了我的情况有很多通过添加调用spl_autoload_register为“初始化”挂钩,我想允许的一部分,大部分静态的需要/包括以在我运行自动加载器之前执行。这是否被认为是插件中的“正确方式”(或至少是一种“可接受的方式”)? – ken 2012-08-06 17:37:32

+0

你也许可以在自动加载器中包含一些条件;例如,如果你的类有一个通用的前缀并且与提供的'$ class'匹配。 – salathe 2012-08-06 17:59:48

+1

您从其他插件获得哪些类型的错误? – drew010 2012-08-06 19:03:06

我相信我现在有一个合理的解决方案,但可以接受其他人的意见。我的解决方案是先让模板加载函数测试文件的存在。我还选择继续钩入“init”钩子,因此静态包含/要求首先被加载(或至少大部分)。该函数现在看起来是这样的:

add_action ('init' , 'class_loader'); 

function class_loader() { 
    // register an autoloader function for template classes 
    spl_autoload_register ('template_autoloader'); 
} 

function template_autoloader ($class) { 
if (file_exists (LG_FE_DIR . "/includes/chart_templates/class.{$class}.php")) 
    include LG_FE_DIR . "/includes/chart_templates/class.{$class}.php"; 

} 
+1

这就是我根据你遇到的错误去建议。既然你只想自动加载自己的类,你应该在试图包含它们之前检查文件是否存在。 spl自动加载器将继续调用其他已注册的自动加载器,直到能够加载所需的类为止。 – drew010 2012-08-06 22:03:16

+0

是的,这绝对是“受到启发”。感谢您的建议。 – ken 2012-08-07 08:32:08

+0

你能告诉我为什么在add_action函数中包装你的class_loader函数吗?当我这样做时,它对我不起作用,但当我仅对spl_autoload_register进行编码时它确实有效。谢谢。 – marczoid 2013-03-25 19:49:59