我在 PHP 中构建以在 WordPress 中使用的自动加载器类有一个奇怪的问题。
核心概念是无论您是子主题、父主题还是插件,它都应该加载类。它应该根据名称找到类(对应于文件夹结构:CoreTheme_Folder_SubFolder_ClassName(){}
=CoreTheme/Folder/SubFolder/ClassName.php
require_once()
这在子主题和父主题中运行良好,在子主题中我包含父主题 function.php 并从那里加载自动加载器,以便我可以在子主题中调用父主题类,而不是在每个地方都有一堆。
当我在插件中执行相同的概念时,问题就来了。Autoloader 是一个框架的一部分(想想 zend),您将其包含在主题的根目录中。如果该主题处于活动状态并且我在插件中设置了自动加载器,它会发出“这个自动加载器有两个实例,你在做什么?” 如果我停用所述主题然后在插件中实例化自动加载器,它无法找到我使用梨命名标准创建的任何类。
因此,对于那些更深入地了解 WordPress 和 PHP 的人,我的问题是,我如何创建我的自动加载器,以便无论天气如何,您的主题、子主题或插件它总能找到您正在寻找的类。
下面的代码是 autloader 类。如果你拿出:plugin_dir_path(__FILE__)
那么会发生的是自动加载器将加载主题中的任何类和相应的子主题。
class AisisCore_Loader_AutoLoader{
protected static $_instance;
protected static $_directories;
public function get_instance(){
if(null == self::$_instance){
self::$_instance = new self();
}
self::$_directories = array(
get_template_directory(),
get_stylesheet_directory(),
plugin_dir_path(__FILE__),
);
return self::$_instance;
}
public function reset_instance(){
self::$_instance = null;
}
public function register_auto_loader(){
spl_autoload_register(array($this, 'load_class'));
}
public function load_class($class){
$path = str_replace('_', '/', $class);
foreach(self::$_directories as $directories){
if(file_exists($directories . '/' . $path . '.php')){
require_once($directories . '/' . $path . '.php');
}
}
}
}
该类通过以下方式在您的父functions.php中实例化:
// Load the autoloader.
require_once(get_template_directory() . '/AisisCore/Loader/AutoLoader.php');
// Setup the autoloader.
$auto_loader = AisisCore_Loader_AutoLoader::get_instance();
$auto_loader->register_auto_loader();
然后在子主题中,您所要做的就是:
require_once(TEMPLATEPATH . '/functions.php');
这允许自动加载器在子主题和父主题中工作。主要问题是,当您创建插件时,您将框架的副本放在插件的 Name 根目录中:plugins/myplugin/AisisCore/
并且在您的主题(父级)中放置一个Themes/MyTheme/AisisCore
所以我明白它为什么会发疯——有点,有什么办法可以绕过它?