ฉันไม่แน่ใจว่ามันเป็นการดีหรือไม่ดีในการโหลดคลาสอัตโนมัติในปลั๊กอิน 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จะเป็นการกระตุ้นให้คุณทำตามแบบแผนการตั้งชื่อคลาสที่ขึ้นต้นด้วยคำว่าclassและชื่อ class ofcourse เครื่องหมายขีดล่าง (_) ใด ๆ จะถูกแทนที่ด้วยเครื่องหมายขีด (-)
ดังนั้นชื่อไฟล์ของคลาส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
ถูกใช้เพื่อโหลดไฟล์จริงเมื่อมีการโทร
การใช้งาน:
คุณเพียงแค่ต้องรวมคลาสตัวโหลดอัตโนมัติด้านบนในไฟล์ฐานของปลั๊กอิน
/**
* Class autoloader.
*/
if ( ! class_exists( 'Annframe_Autoloader' ) ) {
include_once YOUR_PLUGIN_PATH/class-annframe-autoloader.php';
}
แล้วเรียกชั้นเรียนของคุณตามต้องการ
new XYX_Class();
Another_Class::instance(); // etc
หมายเหตุ:ฉันไม่ได้ใช้วิธีเนมสเปซในโซลูชันของฉันดังนั้นจึงอาจเหมาะสมกับความต้องการของคุณ แต่โพสต์ไว้ที่นี่ด้วยความหวังว่ามีคนอย่างน้อยได้รับประโยชน์จากการโหลดคลาสแบบไดนามิก
spl_autoload_register()
โดยไม่มีผลข้างเคียงด้านลบ