Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP自动加载和WordPress_Php_Wordpress_Wordpress Theming_Autoloader - Fatal编程技术网

PHP自动加载和WordPress

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,并从中加载自动加载程序,以便我

我在PHP中构建的autoloader类在WordPress中使用时遇到了一个奇怪的问题

核心概念是,无论您是子主题、父主题还是插件,它都应该加载类。它应该根据名称查找类(core对应于文件夹结构:
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目录
在文件夹中看到它一样。