Tidak, Anda tidak dapat 'menginisialisasi' atau membuat instance kelas melalui hook, tidak secara langsung. Beberapa kode tambahan selalu diperlukan (dan itu bukan hal yang diinginkan untuk dapat melakukan itu, karena Anda membuka sekaleng cacing untuk Anda sendiri.
Inilah cara yang lebih baik untuk melakukannya:
class MyClass {
function __construct() {
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
function getStuffDone() {
// .. This is where stuff gets done ..
}
}
$var = new MyClass();
Tentu saja orang dapat membuat kelas antarmuka untuk menyederhanakannya untuk kasus umum lebih jauh:
class IGetStuffDone {
function IGetStuffDone(){
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
public abstract function getStuffDone();
}
Perhatikan bahwa sebagai antarmuka, Anda tidak dapat membuat objek jenis ini secara langsung, tetapi Anda bisa membuat sub-kelas, membiarkan Anda mengatakan:
class CDoingThings extends IGetStuffDone {
function getStuffDone(){
// doing things
}
}
$var = new CDoingThings();
Yang kemudian akan secara otomatis menambahkan semua kait, Anda hanya perlu mendefinisikan apa yang sebenarnya dilakukan dalam subkelas dan kemudian membuatnya!
Pada Konstruktor
Saya tidak akan menambahkan konstruktor sebagai fungsi pengait, ini praktik yang buruk, dan dapat menyebabkan banyak peristiwa yang tidak biasa. Juga di sebagian besar bahasa, konstruktor mengembalikan objek yang sedang dipakai, jadi jika kait Anda perlu mengembalikan sesuatu seperti dalam filter, itu tidak akan mengembalikan variabel yang difilter seperti yang Anda inginkan, tetapi sebaliknya akan mengembalikan objek kelas.
Memanggil konstruktor atau destruktor adalah praktik pemrograman yang sangat, sangat, sangat buruk, apa pun bahasa Anda, dan tidak boleh dilakukan.
Konstruktor juga harus membangun objek, untuk menginisialisasi mereka siap untuk digunakan, bukan untuk pekerjaan yang sebenarnya. Pekerjaan yang harus dilakukan oleh objek harus dalam fungsi yang terpisah.
Metode kelas statis, dan tidak perlu instantiate / inisialisasi sama sekali
Jika metode kelas Anda adalah metode kelas statis, Anda bisa memberikan nama kelas dalam tanda kutip daripada $this
seperti yang ditunjukkan di bawah ini:
class MyClass {
public static function getStuffDone() {
// .. This is where stuff gets done ..
}
}
add_action( 'admin_init', array('MyClass','getStuffDone' ) );
Penutupan & PHP 5.3
Sayangnya, Anda tidak dapat menghindari garis yang membuat kelas baru. Satu-satunya solusi untuk melewatkannya akan melibatkan kode pelat boiler yang masih memiliki garis itu, dan akan membutuhkan PHP 5.3+ misalnya:
add_action('admin_init',function(){
$var = new MyClass();
$var->getStuffDone();
});
Pada titik mana Anda dapat melewati kelas, dan cukup gunakan fungsi:
add_action('admin_init',function(){
// do stuff
});
Namun perlu diingat Anda sekarang telah memperkenalkan momok fungsi anonim. Tidak ada cara untuk menghapus tindakan di atas menggunakan remove_action
, dan ini dapat dan memang menyebabkan rasa sakit yang luar biasa bagi pengembang yang harus bekerja dengan kode orang lain.
Di Ampersands
Anda mungkin melihat tindakan yang digunakan seperti ini:
array( &$this, 'getStuffDone' );
Ini buruk . &
ditambahkan kembali di PHP 4 ketika objek dilewatkan sebagai nilai, bukan sebagai referensi. PHP 4 berumur lebih dari satu dekade, dan belum didukung oleh WordPress dalam waktu yang lama.
Tidak ada alasan untuk digunakan &this
saat menambahkan kait dan filter, dan menghapus referensi tidak akan menyebabkan masalah, dan bahkan dapat meningkatkan kompatibilitas dengan versi PHP yang akan datang
Gunakan ini sebagai gantinya:
array( $this, 'getStuffDone' );
$class
sebagai nama variabel Anda, kata-kata itu cenderung dicadangkan. Saya pikir Anda akan keluar dari jalan Anda untuk menghindari mengatakan sesuatu yang serupa dengan$x = new Y();
dalam lingkup global, dan Anda menambahkan kompleksitas di mana tidak ada yang diperlukan. Upaya Anda untuk mengurangi jumlah kode yang ditulis telah melibatkan penulisan lebih banyak kode!add_action( 'admin_init', array('MyNamespace\MyClass','getStuffDone' ) );
Kelas contoh
Catatan:
! class_exists
untuk menghindari memanggilnya dua kali dan menempatkan pemanggil init di dalaminit
fungsi dan kelas varstatic
new self
.Ini sebuah contoh
Php 5+
Tolong , tinggalkan
&
. Kami sudah melampaui php4. :)sumber
sumber
Anda dapat memicu peristiwa di kelas Anda tanpa harus memuatnya terlebih dahulu . Ini berguna jika Anda tidak ingin memuat kelas penuh di muka, tetapi perlu mengakses filter dan tindakan WordPress.
Berikut ini contoh yang sangat sederhana
Ini adalah versi yang sangat sederhana dari jawaban Kaiser tetapi menunjukkan secara sederhana perilakunya. Mungkin berguna bagi mereka yang melihat gaya ini untuk pertama kalinya.
Metode lain masih dapat memulai objek jika diperlukan. Saya pribadi menggunakan metode ini untuk memungkinkan bagian opsional plugin saya untuk membuat skrip, tetapi hanya memicu objek pada permintaan AJAX.
sumber
Ini bekerja untuk saya:
sumber
Secara umum, Anda tidak akan menambahkan seluruh kelas ke hook. The
add_action()
/add_filter()
kait berharap callback fungsi , yang dapat dirujuk dari dalam kelas .Katakanlah Anda memiliki
init()
fungsi di dalam kelas Anda, yang ingin Anda kaitkan keinit
kait WordPress .Masukkan
add_action()
panggilan Anda di dalam kelas Anda, dan kemudian identifikasi panggilan balik seperti itu:(Catatan: Saya berasumsi bahwa kelas Anda menggunakan namespace dengan benar; jika tidak, pastikan untuk namespace fungsi panggilan balik Anda.)
sumber
init
(atau di mana pun Anda membutuhkannya)?Anda harus dapat melakukannya dengan meneruskan nama kelas alih-alih objek yang dipakai:
(Secara teori, solusi Anda yang lain harus bekerja juga
Tidak yakin mengapa tidak. Mungkin jika Anda tidak menelepon dengan referensi?)
sumber
init
metode statis . Lihat wordpress.stackexchange.com/a/48093/14052