我真的不确定在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: 我的解决方案中没有使用名称空间方法,因此它可能适合您的需要,也可能不适合您的需要,但我将其发布在这里,希望至少有人能够从动态加载类中获得好处。