0

我在 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

所以我明白它为什么会发疯——有点,有什么办法可以绕过它?

4

1 回答 1

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

于 2013-11-19T03:29:12.670 回答