Tôi thực sự không chắc chắn liệu nó tốt hay xấu khi tự động tải các lớp trong plugin WP. Đối với tôi, tôi thấy không có tác dụng phụ của việc sử dụng spl_autoload_register
(không được kiểm tra hiệu suất)
Vì vậy, để trả lời câu hỏi của bạn, tôi muốn chia sẻ một lớp từ plugin sắp tới mà tôi đang sử dụng để tự động tải các lớp từ một thư mục mà không có bất kỳ vấn đề nào và cho đến nay nó vẫn tốt cho tôi.
/**
* 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();
Để phá vỡ lớp đơn giản này trong các phần như bạn thấy tôi đang sử dụng mẫu Singleton. Constructor
là riêng tư và instance()
& $_instance
thuộc về mẫu. Con constructor có spl_autoload_register
chức năng.
spl_autoload_register( array( $this, 'load' ) );
đó là load
phương thức gọi từ lớp tự. Hai dòng đầu tiên của phương pháp này là:
$file = str_replace( '_', '-', strtolower( $class_name ) );
$file = 'class-' . $file;
đó là khá thẳng. nếu bạn theo WPCS, nó khuyến khích bạn tuân theo quy ước đặt tên lớp có tiền tố với lớp từ và sau đó là tên lớp. tất cả mọi dấu gạch dưới (_) được thay thế bằng dấu gạch ngang (-).
vì vậy một tên tập tin của lớp WPSE_Post
sẽ làclass-wpse-post.php
Tên lớp vỏ thấp hơn với strtolower
và sử dụng str_replace
để thay thế dấu gạch dưới bằng dấu gạch ngang. vì vậy WPSE_Post
bây giờ trở thành wpse-post
. cuối cùng thêm một tiền tố class-
vào dòng tiếp theo.
tôi đang sử dụng is_readable
trong tuyên bố có điều kiện có thể trao đổi với file_exists
. giả sử YOUR_PLUGIN_PATH
là đường dẫn cơ sở của plugin và classes-dir
nằm dưới đường dẫn plugin chính chứa tất cả các lớp của bạn cần tự động tải.
include_once
được sử dụng để tải tập tin thực tế trong cuộc gọi.
Sử dụng:
bạn chỉ cần đưa lớp trình tải tự động ở trên vào tệp cơ sở của plugin
/**
* Class autoloader.
*/
if ( ! class_exists( 'Annframe_Autoloader' ) ) {
include_once YOUR_PLUGIN_PATH/class-annframe-autoloader.php';
}
và sau đó gọi các lớp học của bạn theo yêu cầu.
new XYX_Class();
Another_Class::instance(); // etc
Lưu ý: Tôi không sử dụng phương thức không gian tên trong giải pháp của mình để nó có thể phù hợp hoặc không phù hợp với nhu cầu của bạn nhưng được đăng ở đây với hy vọng rằng ai đó ít nhất sẽ nhận được lợi ích của việc tải các lớp một cách linh hoạt.
spl_autoload_register()
mà không có tác dụng phụ tiêu cực.