Mengapa Anda perlu membungkus fungsi di dalam array ($ this, function)

8

Saya seorang pemula di PHP dan WordPress, jadi harap lembut!

Saya sedang membangun sebuah plugin - mengikuti beberapa tutorial, membuat semuanya berfungsi.

Pertanyaan saya adalah mengapa fungsi yang ingin saya panggil terbungkus array($this, function)? Sebagai contoh saya memiliki kode konstruktor ini di dalam kelas saya

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

Fungsi getStuffDone dipecat OK - tetapi mengapa harus dalam format yang ada di dalamnya?

Wawasan apa pun sangat dihargai.

Simon
sumber
1
Saya tidak cukup tahu tentang OOP untuk memberikan jawaban yang informatif tetapi beberapa penelitian memberikan beberapa referensi yang baik: Menggunakan add_actiondengan Kelas dan PHP Melewati ke Fungsi
Howdy_McGee
Jangan sekali-kali mendaftarkan panggilan balik dalam konstruktor. Itu membuat kode Anda tidak dapat diuji.
fuxia
tautan @toscho ke contoh pengaturan inisialisasi yang benar? Memanggil fungsi init () khusus atau sesuatu dari konstruktor?
lkraav
@ lkraav Lihat jawaban gmazzap untuk pertanyaan itu .
fuxia

Jawaban:

6

Ini adalah panggilan balik PHP . Anda memerlukan sintaks untuk menyimpan referensi ke instance kelas.

Begini - jika Anda tidak punya $this, bagaimana penelepon tahu itu getStuffDoneadalah metode kelas Anda, dan bukan hanya fungsi PHP biasa? Tidak.

Menggunakan array( $this, 'getStuffDone' )kata ke PHP:

Hei teman, Anda perlu memanggil metode getStuffDoneini di kelas saya ini

TheDeadMedic
sumber
Apa yang saya tidak mengerti, yang mungkin bagaimana saya membacanya, tetapi kalimat pertama di bawah Passing mengatakan except language constructs such as: array(), tetapi di sini kita melewati sebuah array. Apakah ini salah ketik atau saya salah membaca kalimat?
Howdy_McGee
Tidak itu benar, tapi itu mengacu pada fungsi, bukan metode. Baca para langsung di bawahnya.
TheDeadMedic
5

yang ADD_ACTIONsebagai () definisi fungsi terlihat seperti:

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

jadi menurut itu seperti yang diharapkan (string, string, int, int)

Dalam file php tradisional parameter kedua hanya akan menjadi salah satu nama fungsi Anda.

jadi Anda akan melakukannya add_action('admin_init','my_init_function')

Sepertinya Anda menggunakan kelas untuk mengenkapsulasi plugin Anda. Kelas-kelas lain bisa memiliki fungsi di dalamnya dengan nama yang sama ( getStuffDone ).

Jadi fungsi Anda hanya diketahui dengan referensi ke kelas Anda, itu sebabnya Anda harus menentukan kelas Anda $thisserta nama fungsinya.

Jika Anda mencoba untuk mereferensikan fungsi di dalam kelas Anda harus menggunakan sintaks callable array

Lihat juga codex.wordpress.org

Loopo
sumber
1

Lihat dokumentasi, di bawah " Catatan Kontribusi Pengguna ":

"Untuk menggunakan add_action() ketika plugin atau tema Anda dibangun menggunakan kelas , Anda perlu menggunakan sintaks callable array. Anda akan meneruskan fungsi add_action()sebagai array, dengan $thissebagai elemen pertama, lalu nama metode kelas ..."

farzad
sumber