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' );