PHP自动加载和WordPress
我在PHP中构建的autoloader类在WordPress中使用时遇到了一个奇怪的问题 核心概念是,无论您是子主题、父主题还是插件,它都应该加载类。它应该根据名称查找类(core对应于文件夹结构:PHP自动加载和WordPress,php,wordpress,wordpress-theming,autoloader,Php,Wordpress,Wordpress Theming,Autoloader,我在PHP中构建的autoloader类在WordPress中使用时遇到了一个奇怪的问题 核心概念是,无论您是子主题、父主题还是插件,它都应该加载类。它应该根据名称查找类(core对应于文件夹结构:CoreTheme\u folder\u SubFolder\u ClassName(){}=CoreTheme/folder/SubFolder/ClassName.php 这适用于子主题和父主题,在子主题中,我包括parent themes function.php,并从中加载自动加载程序,以便我
CoreTheme\u folder\u SubFolder\u ClassName(){}
=CoreTheme/folder/SubFolder/ClassName.php
这适用于子主题和父主题,在子主题中,我包括parent themes function.php,并从中加载自动加载程序,以便我可以在子主题中调用父主题类,而不是在每个地方都有一堆require\u once()
问题来了,当我在插件中执行相同的概念时。自动加载器是一个框架的一部分(想想zend),你在主题的根目录中包含了这个框架。如果这个主题是活动的,我在插件中设置了自动加载器,它会突然说“这个自动加载器有两个实例,你在做什么?”如果我停用上述主题,然后在插件中实例化autoloader,它将找不到我使用pear命名标准创建的任何类
因此,我想问那些对WordPress和PHP有更深层次理解的人,我如何创建我的自动加载器,这样,不管你的主题、子主题或插件是什么,它都能找到你想要的类
下面的代码是autloader类。如果您取出:plugin\u dir\u path(\uu文件\uuuu)
,则自动加载程序将加载主题和相应子主题中的任何类
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');
这允许自动加载器同时在子主题和父主题中工作。主要问题是,当您创建插件时,您将框架的一个副本放在插件的名称根目录中:plugins/myplugin/aiiscore/
和主题(父主题)Themes/MyTheme/aiiscore
所以我可以理解为什么它会崩溃——有点像,有什么办法可以解决它?我想你只想加载一个类,所以像这样使用
return;
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');
return;
}
}
}
否则您将加载多个类。请检查以下内容:
插件目录路径(\uuuuu文件)
可能是错误的。此外,您不需要单件,只需允许添加目录,然后就可以在运行时注册新插件或主题目录。使用一个抽象类,这在Wordpress中效果更好。就像@hakre在中建议您的那样。实际上,该函数在Wordpress中是正确的,如果不是整个应用程序都会崩溃,我的i类的实现是正确的,因为它可以工作-我看不到抽象类的优点,但感谢;)。这里的问题是,如果任何活动主题中有AisisCore库,它就会崩溃。这里的问题是:自动加载程序在插件的插件目录中看不到任何东西。有条件地检查自动加载程序是否在插件或主题中初始化。您需要对此进行一点故障排除(在这样做的同时,您还将学到一些有用的东西)。而plugin\u dir\u path(\uuuuu FILE\uuuuu)
是一个伪造者。注意什么是\uuuuuuuuu文件
。请参阅源代码:我知道\uuuu File\uuu
指向调用代码的文件的根。因此,对于我来说,我正在调用文件根目录下的plugin\u dir\u path(\uu文件\uu)
。理论上,这应该可以看到aiiscore/,它也在我的插件目录的根目录下,就像get\u template\u目录
在文件夹中看到它一样。