なぜ配列($ this、関数)の中に関数をラップする必要があるのですか?


8

私はPHPとWordPressの初心者なので、優しくしてください。

プラグインを作成しています-いくつかのチュートリアルに従って、すべてを動作させます。

私の質問は、なぜ私が呼び出したい関数がラップされているのarray($this, function)ですか?たとえば、私は私のクラス内にこのコンストラクタコードを持っています

 function __construct() {
      add_action( 'admin_init',array( $this, 'getStuffDone' ) );
 }

getStuffDone関数は正常に起動しますが、なぜそれが含まれている形式でなければならないのですか?

どんな洞察も大歓迎です。


1
私は有益な答えを与えるためにOOPについて十分知らないが、いくつかの研究は、いくつかの良い参照を提供します:使用するadd_actionクラスとし、PHPは関数に渡す
Howdy_McGee

コンストラクタにコールバックを登録しないでください。それはあなたのコードをテスト不可能にします。
fuxia

@toschoは正しい初期化設定の例にリンクしていますか?コンストラクタから専用のinit()関数または何かを呼び出しますか?
lkraav、2015

@lkraav その質問に対する gmazzapの回答を参照してください。
fuxia

回答:


6

これはPHPコールバックです。クラスインスタンスへの参照を保持する構文が必要です。

このように$this記述します-を持っていなかった場合、呼び出し元getStuffDoneは、それが通常のPHP関数だけでなく、クラスのメソッドであることをどのようにして知るのでしょうか。そうではありません。

使用してarray( $this, 'getStuffDone' )PHPに書かれています:

ねえgetStuffDone、私のクラスのこのインスタンスでメソッドを呼び出す必要があります


私が理解していないこと、それは私がそれをどのように読んでいるのかかもしれませんが、Passingの下の最初の文はと書いてexcept language constructs such as: array()いますが、ここでは配列を渡しています。これはタイプミスですか、それとも文章を間違って読んでいますか?
Howdy_McGee

いいえ、そうではありませんが、メソッドではなく関数を指します。そのすぐ下のパラを読んでください。
TheDeadMedic

5

add_action()関数の定義を次のようになります。

 function add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) {
     return add_filter($tag, $function_to_add, $priority, $accepted_args);
 }

したがって、期待どおりに見える(string、string、int、int)

従来のphpファイルでは、2番目のパラメーターは単に関数名の1つです。

だからあなたは add_action('admin_init','my_init_function')

プラグインをカプセル化するためにクラスを使用しているようです。他のクラスには、同じ名前(getStuffDone)の関数を含めることができます。

したがって、関数はクラスを参照することでのみ認識されます。そのため、クラス$thisと関数名を指定する必要があります。

クラス内の関数を参照しようとしている場合は、配列呼び出し可能構文を使用する必要があり ます

codex.wordpress.orgも参照してください


1

ユーザー投稿ノート」の下のドキュメントを参照してください。

add_action() プラグインまたはテーマがクラスを使用して構築されている場合に使用するには、配列呼び出し可能構文を使用する必要があります。最初の要素として、次にクラスメソッドの名前add_action()として、関数を配列として渡し$thisます...」

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.