0

我有一个奇怪的问题,我用PHP构建的自动加载器类在WordPress中使用。PHP自动加载和WordPress

核心概念是它应该加载类,而不管你是孩子的主题,父主题还是插件。它应该找到基于名称(coreesponding文件夹结构类:CoreTheme_Folder_SubFolder_ClassName(){} = CoreTheme/Folder/SubFolder/ClassName.php

这个作品在儿童主题和父主题,在孩子的主题包括我function.php并从那里加载父主题精自动加载器,这样我就可以在子主题中调用父主题类,并且不会在每个地方都有一堆require_once()

问题出现了,当我在插件中执行相同的概念时,Autoloader是一个框架如果这个主题是主动的,并且我在插件中设置了自动加载器,它会大声说“这个自动加载器有两个实例,你在做什么?”如果我停用说当时的主题整理插件中的自动加载器,它无法找到我使用梨命名标准创建的任何类。

所以我的问题对于那些在更深层次上理解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'); 

这允许自动加载磁带机在儿童和父母的主题上工作。主要的问题是,当你创建一个插件,您将框架的一个副本在你的插件的名称根目录:在你的主题plugins/myplugin/AisisCore/和一个(父)Themes/MyTheme/AisisCore

所以我能看到为什么它会崩溃了 - 那种,有什么方法可以解决它?

+0

'plugin_dir_path(__ FILE __)'很可能是错误的。你也不需要单身人士,只需添加目录,然后你就可以在运行中注册新的插件或主题目录。改为使用抽象类,这在Wordpress中效果更好。像@hakre在[你之前的问题]中建议你(http://stackoverflow.com/q/15534211/2261774)。 –

+0

其实该功能是正确的,如WordPress中所述,如果不是整个应用程序会崩溃,我的类的实现是正确的,因为它的工作原理 - 我看不到抽象类的优点,但感谢那;)。这里的问题是,如果任何活动的主题都有AisisCore库,它就会吓倒。问题在这里:http://wordpress.stackexchange.com/questions/95742/am-i-not-understanding-plugins是关于自动加载器没有看到任何插件目录中的插件。 – TheWebs

+0

有条件地检查自动装入器是否在插件或主题内初始化。你需要排除这个问题(你也会在学习时学习有用的东西)。 'plugin_dir_path(__ FILE __)'是一个faker。注意什么'__FILE__'是。见源代码:http://core.trac.wordpress.org/browser/tags/3.5.1/wp-includes/plugin.php#L577 –

回答

0

我想你想只装一类,所以使用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; 
     } 
    } 
} 

,否则你将加载多个类。看看这个: http://php.net/return