Ketika mengembangkan sebuah plugin haruskah fungsi dikelompokkan bersama menjadi suatu Kelas untuk menghindari konflik namespace?
Ya, tapi itu hanya salah satu argumen kecil. Sebenarnya itu bukan sifat "benar" dari kelas di OOAD .
Apakah menggunakan kelas membuat overhead kinerja untuk PHP?
Tidak, terutama. Desain yang buruk dan / atau kode tertulis yang buruk atau optimasi pra-matang menciptakan masalah kinerja yang jauh lebih banyak daripada fitur bahasa yang sebenarnya.
Jika ada hit kinerja, haruskah nama fungsi hanya diperbaiki sebelumnya?
Seperti yang ditulis, tidak ada hit kinerja. Kode tertulis yang buruk akan lebih menjadi hit kinerja daripada kode tertulis yang baik yang memiliki beberapa baris kode tetapi tidak memaksa Anda untuk melakukan hal-hal buruk.
Intinya:
Anda dapat menggunakan kelas dengan berbeda untuk plugin. Anda bisa menggunakannya untuk memiliki semacam namespace dan menggunakannya "hanya" untuk fungsi global. Bentuk paling langsung dari itu adalah fungsi kelas statis, contoh kode berikut menunjukkan keduanya, fungsi global pertama, kemudian fungsi kelas statis global:
/* global function */
function myplug_hook()
{
}
add_filter('the_hook', 'myplug_hook');
/* global static function */
class myplug
{
public static function hook()
{
}
}
add_filter('the_hook', 'myplug::hook');
Ini hanyalah sedikit contoh yang menunjukkan bahwa Anda perlu mengetik lebih banyak untuk pengait tunggal. Selain itu itu menunjukkan bagaimana ruang nama bekerja: Anda dapat lebih mudah mengganti nama kelas tunggal untuk mengubah nama semua fungsi statis dan kemudian mencari dan mengganti myplug::
yang bisa lebih sulit dengan myplug_
karena kesalahan positif. Namun pada akhirnya tidak ada banyak perbedaan.
Kuncinya adalah: fungsi kelas statis Documents tidak terlalu banyak selain fungsi global Documents .
Dan contoh ini juga menunjukkan: Namespacing baik-baik saja, tetapi dengan worpdress, namespacing berhenti menggunakan kait: Fungsi callback di-hardencode, karenanya manfaat dalam namespacing menggunakan kelas (satu tempat untuk nama-dasar, nama kelas) tidak membantu ketika Anda mengintervensi kode Anda dengan wordpress untuk nama hook.
Manfaat sebenarnya dimulai dengan menggunakan instance kelas aktual dan fungsi non-statis. Ini memiliki keuntungan bahwa Anda dapat mulai menggunakan prinsip-prinsip OO dan Anda dapat merampingkan kode Anda. Fungsi kelas statis lebih merupakan masalah daripada solusi infact.
Maka itu lebih dari sekedar gula sintaksis.
Poin utamanya adalah: Lakukan sesuatu yang membantu Anda menulis kode yang dapat Anda tangani dan pelihara dengan mudah. Jangan menilai terlalu tinggi, itu kesalahan umum. Yang lebih penting adalah Anda menulis kode yang mudah dibaca dan dipahami, hanya melakukan apa yang Anda butuhkan. Mungkin pertanyaan dan jawaban ini bermanfaat untuk gambaran yang lebih besar dalam konteks ini: Beberapa Bantuan Metabox Kustom .
Salah satu pendekatan umum yang saya miliki bahkan dengan plugin yang lebih kecil adalah menggunakan fungsi pembantu statis untuk instantiate plugin dan sisanya berada dalam instance plugin itu. Ini membantu untuk merangkum logika plugin utama dan manfaat dari penamaan namespace dengan kait juga bahwa anggota pribadi dapat digunakan kembali antara kait yang tidak mungkin dengan fungsi global standar. Contoh kode berikut menunjukkan polanya:
<?php
/** Plugin Headers ... */
return MyPlugin::bootstrap();
class MyPlugin
{
/** @var MyPlugin */
static $instance;
static public function bootstrap() {
if (NULL === self::$instance) {
self::$instance = new __CLASS__;
}
return self::$instance;
}
# ...
}
Ini adalah pola umum yang saya gunakan untuk file plugin dasar. Kelas plugin di satu sisi mewakili plugin untuk wordpress dan di sisi lain memungkinkan untuk mulai menggunakan paradigma berorientasi objek untuk kode sendiri yang bahkan dapat sepenuhnya berorientasi objek (tetapi tidak harus). Ini semacam pengontrol, berinteraksi dengan seluruh API wordpress sebagai permintaan.
Seperti yang ditunjukkan oleh contoh, sebuah instance dari plugin akan dibuat. Ini memungkinkan Anda untuk menggunakan milik umum yang dikenal seperti Constructor Docs ( __construct
) untuk menginisialisasi plugin yang sebenarnya:
# ...
class MyPlugin
{
# ...
public function __construct()
{
add_filter('the_hook', array($this, 'hook'));
}
public function hook()
{
}
# ...
}
Pada saat hook terdaftar, objek plugin ini sudah mendapatkan manfaat dari desainnya: Anda telah berhenti melakukan hard-code pada fungsi hook aktual terhadap classname plugin beton . Itu mungkin karena pengikatan kelas ke objek contoh untuk panggilan balik. Kedengarannya rumit, hanya mengatakan: $this
adalah plugin. Dapat digunakan dalam hookbackback, bandingkan metode Kelas Pendaftaran sebagai hookbackback .
Pola ini memungkinkan antarmuka yang lebih mudah dengan wordpress: injeksi direduksi menjadi nama kait dan data apa yang disediakannya. Anda kemudian dapat mulai mengimplementasikan langsung ke kelas plugin ini atau untuk menolak implementasi Anda terhadapnya, jadi untuk hanya memasukkan kode ke dalam kelas plugin yang merupakan batas minimum untuk mendefinisikan antarmuka plugin Anda terhadap wordpress, tetapi simpan logika umum di samping worpdress. Di sinilah kesenangan dimulai dan kemungkinan besar apa yang ingin dicapai oleh setiap pembuat plugin dalam jangka panjang.
Jadi jangan memprogram dengan worpdress tetapi menentangnya. Karena worpdress cukup fleksibel, tidak ada antarmuka yang umum atau mudah untuk dideskripsikan. Kelas plugin dasar dapat mengambil peran ini, memungkinkan Anda lebih fleksibel untuk kode Anda sendiri yang akan mengarah pada kode yang lebih mudah dan kinerja yang lebih baik.
Jadi ada lebih dari sekedar manfaat untuk penamaan nama. Saran terbaik yang bisa saya berikan adalah: Coba sendiri. Tidak banyak yang akan Anda lepas, hanya hal-hal baru yang bisa ditemukan.
Kemungkinan besar Anda akan melihat perbedaan setelah melewati beberapa pembaruan wordpress yang lebih penting sambil menjaga plugin Anda tetap kompatibel.
Peringatan : Jika plugin Anda terintegrasi langsung dengan wordpress untuk menyelesaikan pekerjaan, menggunakan satu atau dua fungsi publik mungkin lebih cocok untuk Anda. Ambil alat yang tepat untuk pekerjaan itu.