我应该在我的插件中使用spl_autoload_Register()吗?

时间:2014-08-21 作者:johnny

当我在插件中使用spl\\u autoload\\u register时,我得到:

    Fatal error: Uncaught exception \'LogicException\' with message
   \'Class wp_atom_server could not be loaded\'

    wp-includes\\pluggable-deprecated.php on line 182
我读了一些书,找到了各种修复方法。One on SO 说不要在WordPress上使用spl_自动加载_寄存器。

准确吗?

我确信我可以找到一个“修复”错误的方法,但我不确定我想在每个WP版本中都这样做。

如果我不使用自动加载功能,我应该如何加载我的类?以下是现在中断的内容:

spl_autoload_extensions(".php");
spl_autoload_register();

use MyPluginClasses\\Student as MS;

$student = new MS\\Student();

echo $student->sayHello();
在校学生:

<?PHP
namespace MyPluginClasses\\Student
{
    class Student{
        public function __Construct(){
            echo "Hello Johnny";
        }
        public function sayHello(){
            echo "Hello Johnny\'s Method";

        }

    }
}
这种设计在WordPress之外运行良好。

2 个回复
SO网友:Anwer AR

我真的不确定在WP插件中自动加载类是好是坏。对我来说,我看不到使用spl_autoload_register (未测试性能)

为了回答你的问题,我想分享我即将推出的插件中的一个类,我正在使用它从单个目录自动加载类,没有任何问题,到目前为止,它对我来说做得很好。

/**
 * Annframe Class Autoloader.
 *
 * @package Annframe
 * @since 0.1.0
 */
class Annframe_Autoloader {
    /**
     * Singleton.
     *
     * @since 0.1.0
     * @var Annframe_Autoloader - Single instance.
     */
    private static $_instance = null;

    /**
     * Private Construct.
     *
     * @package Annframe
     * @since 0.1.0
     */
    private function __construct() {
        spl_autoload_register( array( $this, \'load\' ) );
    }

    /**
     * Singleton method.
     *
     * @package Annframe
     * @since 0.1.0
     */
    public static function _instance() {
        if ( ! self::$_instance ) {
            self::$_instance = new Annframe_Autoloader();
        }
        return self::$_instance;
    }

    /**
     * Class Loader.
     *
     * @package Annframe
     * @since 0.1.0
     *
     * @param string $class_name - Class name to load.
     * @return null - Do not return anything.
     */
    public function load( $class_name ) {
        $file = str_replace( \'_\', \'-\', strtolower( $class_name ) );
        $file = \'class-\' . $file;
        if ( is_readable( trailingslashit( YOUR_PLUGIN_PATH. \'/classes-dir\' ) . $file . \'.php\' ) ) {
            include_once trailingslashit( YOUR_PLUGIN_PATH. \'/classes-dir\' ) . $file . \'.php\';
        }
        return;
    }
}

Annframe_Autoloader::_instance();
如您所见,为了将这个简单的类分解为多个部分,我使用的是单例模式。Constructor 是私有的,并且instance() &;$_instance 属于该模式。构造函数具有spl_autoload_register 作用

spl_autoload_register( array( $this, \'load\' ) );
正在呼叫load 方法。此方法的前两行是:

$file = str_replace( \'_\', \'-\', strtolower( $class_name ) );
$file = \'class-\' . $file;
这很直接。如果你遵循WPCS 它鼓励您遵循以word为前缀的类命名约定class 然后是类名。当然,任何下划线(\\-)都将替换为(-)破折号。

所以类的文件名WPSE_Post 可能是class-wpse-post.php

小写类名,带strtolower 和使用str_replace 将下划线替换为破折号。所以WPSE_Post 现在变成wpse-post. 最后添加前缀class- 在下一行。

我正在使用is_readable 在可与交换的条件语句中file_exists. 假设YOUR_PLUGIN_PATH 是插件的基本路径,并且classes-dir 位于主插件目录下,保存所有需要自动加载的类。

include_once 用于在调用时加载实际文件。

Usage:

您只需要在插件的基文件中包含上述自动加载器类

/**
 * Class autoloader.
 */
if ( ! class_exists( \'Annframe_Autoloader\' ) ) {
    include_once YOUR_PLUGIN_PATH/class-annframe-autoloader.php\';
}
然后根据需要给你的班级打电话。

new XYX_Class();
Another_Class::instance(); // etc
Note: 我的解决方案中没有使用名称空间方法,因此它可能适合您的需要,也可能不适合您的需要,但我将其发布在这里,希望至少有人能够从动态加载类中获得好处。

SO网友:Meldin Xavier
    function MyPluginClasses_autoloader( $class_name ) {
  if ( false !== strpos( $class_name, \'MyPluginClasses\' ) ) {
    $parts = explode(\'\\\\\', $class_name);
    require_once RoothPath . DIRECTORY_SEPARATOR .\'lib\'.DIRECTORY_SEPARATOR.end($parts) . \'.php\';
  }
}
spl_autoload_register( \'MyPluginClasses_autoloader\' );
use MyPluginClasses\\Student as MS;
$student = new MS\\Student();
echo $student->sayHello();
结束

相关推荐

如何从另一个PHP函数引用/Echo变量

我已经成功地为我的博客帖子设置了一个PHP函数,以创建一个快捷码,自动显示/设置YouTube视频的iFrame标记的样式,并将持续时间和视图计数直接拉到下面。我现在只想在主页/列表页上显示视频的视图计数和持续时间值(通过loop.php),但很难确定合适的php代码来实现这一点。以下是我在post视图中成功使用的函数:add_shortcode(\'yt\', \'getYoutubeDetails\'); function getYoutubeDetails($atts) {