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
自己クラスからメソッドを呼び出しています。このメソッドの最初の2行は次のとおりです。
$file = str_replace( '_', '-', strtolower( $class_name ) );
$file = 'class-' . $file;
かなりまっすぐです。WPCSに準拠している場合は、単語クラスとクラス名の接頭辞が付いたクラス命名規則に従うことをお勧めします。もちろん、アンダースコア(_)は(-)ダッシュに置き換えられます。
そのクラスのファイル名は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()
、悪影響を与えることなく使用できます。