web-dev-qa-db-ja.com

グローバルオブジェクトとパブリックメソッド

私はプラグインを開発していて、ベストプラクティスについて考えているだけです。グローバルオブジェクトを持つことはどれくらい一般的ですか?現在plugins_loadedに私は私のクラスのグローバルオブジェクトを作成しています:

add_action( 'plugins_loaded', array( 'Test_Plugin', 'init' ) );
...
public static function init() {
    global $testerski;
    $testerski = __CLASS__;
    $testerski = new $testerski;
}

これにより、global $testerskiを使用して任意の変数またはメソッドを呼び出すことができます。これは一般的なやり方ですか?


私のもう一つの懸念は、私がグローバルオブジェクトを作成しているので、そして私の理解からは、WordPressがそれらを呼び出すことができるように、どのフックもパブリック関数を持つ必要があるということです。問題は、私のグローバルオブジェクトからフック用のこれらの関数を呼び出せることです。たとえば、次のように登録されたフックがいくつかあります。

public function __construct() {
    add_action( 'init',             array( $this, 'test_plugin_setup' )             );
    add_action( 'template_include', array( $this, 'test_templates' )                );
    add_filter( 'cron_schedules',   array( $this, 'test_add_monthly_schedule' )     ); 
}

public function test_templates( $template ) {
    ...
}

どちらのIが技術的に$testerski->test_templates()を使って呼び出すことができます。この関数は実際には直接呼び出されるべきではなく、フックにしか使用されるべきではないので、このように直接呼び出されるのを防ぐことができる方法はありますか?このようなことは危険ですか、それとも私はそれをひっくり返していますか?

wp_enqueue_scriptsが間違って呼ばれたという通知をあなたに与えるように、私はいくつかのフックが警告を持っているのに気づいた。

6
Howdy_McGee

これは一般的なやり方ではありませんが、うまくいきます。もっと良い方法は、WooCommerceや他の多くのものと同じように、クラスを使用し、シングルトンパターンを使用することです。

  • 以下のような静的関数(instancegetInstance...と呼ばれる)。
    • まだ行っていない場合はインスタンス(オブジェクト)を作成して返します。
    • またはは既存のインスタンスを返します

WooCommerceの例を続けましょう。これまでは、グローバルオブジェクトにアクセスするためにこれを行っていました。

global $woocommerce; 

今私達はする:

WooCommerce::instance();

# Or with the handy Shortcut
WC();

ぜひ読んでください。


メソッドの中でcurrent_filter()の値をチェックすることはできますが、私があなたであれば、私は気にしません。これは脅威ではありません。他の開発者があなたのコードを使用したいと思うかもしれないので、それらをブロックしないでください。

1
Nabil Kadimi