0

私が作成するすべてのワードプレスプラグインで使用するボイラープレートクラスを作成しています。(「ボイラープレート」がこれを呼び出す正しい方法でない場合、モッズは自由に編集してください)。すべてのプラグインとコード全体で使用するいくつかの定数があるので、それらに名前を付ける正しい方法を探しています。

私のコードでは、これがあります:

//edit these
define( 'WPB_PREFIX'                        , 'wsm');
define( 'WPB_SLUG'                          , 'wp-simple-monitor'); // Need to match plugin folder name
define( 'WPB_PLUGIN_NAME'                   , 'WP Simple Monitor');
define( 'WPB_VERSION'                       , '1.0');
//dont edit
define( WPB_PREFIX.'_ABS_PATH'              , WP_PLUGIN_DIR . '/'. WPB_SLUG          );
define( WPB_PREFIX.'_REL_PATH'              , dirname( plugin_basename( __FILE__ ) )             );
define( WPB_PREFIX.'_PLUGIN_URL'            , WP_PLUGIN_URL . '/'. WPB_SLUG          );

class WP_Plugin_Base
    {
    // ...
    _e('Settings', WPB_PREFIX);
    // ...
    }

たとえば、コード全体で次のように使用します。

<?php _e('Settings', WPB_PREFIX);?>

これまでのところすべて問題ありませんが、同じプロジェクトで 2 つのプラグインの使用を終了する場合は、すべてのコードを確認し、既に定義されているように「WPB_PREFIX」を変更する必要があります。すべてのコードをスローせずにこれを行う簡単な方法はありますか?

ありがとう

4

1 に答える 1

2

それらをグローバル定数の代わりにクラス プロパティとして定義できます (またそうすべきです!) 。アクセスする必要がある定数のデフォルトを設定する基本クラスを作成してから、クラスを拡張できます。

class WP_Plugin_Base
{
    protected $wpbPrefix = 'wsm';
    protected $wpbSlug = 'wp-simple-monitor';
    // etc.
}

class WP_Plugin_Specific extends WP_Plugin_Base
{
    protected $wpbSlug = 'wp-plugin-specific';

    function someMethod() {
        _e('Settings', self::wpbPrefix);
        _e('Slug', self::wpbSlug);
    }
}

後者のクラスのメソッドの出力は、元のプレフィックスに新しいスラッグを付けたものになります。コメントに記載されているように、連結された部分で物事を定義できるようにするには、クラス定数ではなく保護された変数が必要です。

protected $absPath = WP_PLUGIN_DIR . '/' . $wpbSlug;
protected $relPath = dirname( plugin_basename( __FILE__ ) );
protected $pluginUrl = WP_PLUGIN_URL . '/' . $wpbSlug;

そうすれば、必要な特定のクラスを使用するときはいつでも、既に持っているジェネリック クラスから得られるすべての利点を得ることができますが、共通部分の問題は発生しません。

これにより、すでに定義されている場合に何をすべきかを理解しようとすることもできなくなります。また、デフォルトのままにしておくことが理にかなっている場合はいつでも、次のことができることを意味しますself::property。オーバーライドしていない場合は、基本クラスのプロパティを取得します。これにより、探しているものがすべて得られるはずであり、その過程でグローバル名前空間が乱雑になることはありません。

于 2013-05-14T02:36:26.243 に答える