Menggunakan kelas alih-alih fungsi global di functions.php


11

Dalam banyak tema yang saya lihat (termasuk TwentyEleven) dan dalam contoh yang saya temukan online, ketika membangun functions.phpfile untuk tema semua fungsi dideklarasikan dalam lingkup global. Untuk memperjelas, seperti inilah tampilan file fungsi:

function my_theme_do_foo() { // ... }

function my_theme_do_bar() { // ... }

add_action( 'foo_hook', 'my_theme_do_foo' );

Tampaknya bagi saya bahwa hal-hal dapat "dienkapsulasi" sedikit lebih baik jika kelas digunakan:

class MyTheme {
    function do_foo() { // ... }
    function do_bar() { // ... }
}

$my_theme = new MyTheme();

add_action( 'foo_hook', array( &$my_theme, 'do_foo' ) );

Keuntungan dari pendekatan kedua (di mata saya yang rendah hati):

  • Nama fungsi yang lebih pendek
  • Akses ke variabel instan (IMO keuntungan terbesar)
  • Tidak ada fungsi global

Kerugiannya:

  • Classname masih dapat menyebabkan konflik
  • Tidak jelas untuk "menyesuaikan" dengan tema anak (harus memperpanjang kelas induk)
  • Sebagian besar tema belum melakukannya dengan cara ini, jadi Anda akan merusak tren

Saya mungkin mengabaikan beberapa hal, tetapi saya bertanya-tanya mengapa tidak mengambil pendekatan OOP? Rasanya agak "lebih bersih" bagi saya, jika ada. Mungkin saya salah?

Saya cukup baru untuk pengembangan tema WordPress, jadi maafkan saya jika ini adalah pengetahuan umum di komunitas WP :). Hanya mencoba mempelajari mengapa segala sesuatunya seperti itu adanya.


Anda dapat memeriksa tema dari Kovshenin - wordpress.org/extend/themes/profile/kovshenin ia menggunakan pendekatan OOP di functions.php
Mamaduka

Jawaban:


9

Menggunakan kelas untuk enkapsulasi adalah pendekatan yang sangat umum oleh sejumlah pengembang untuk plugin. Saya melakukan ini, dan saya merasa lebih bersih. Tetapi untuk plugin. Tema lebih bersifat prosedural.

Kami tidak melakukannya untuk tema WordPress default karena hal itu menimbulkan penghalang untuk masuk. Fungsinya cukup sederhana. Menghapus tindakan terkait dengan kelas bisa sulit (dan berpotensi buggy dalam keadaan tertentu).

Juga, sejumlah fungsi dalam tema default dapat dicolokkan. Memperluas kelas dan mengganti metode jauh lebih rumit dari sekadar mendefinisikan fungsi. Dan sementara dua aspek kode yang berbeda dapat menggantikan fungsi yang berbeda, Anda tidak dapat memperluas kelas secara dinamis. Seperti yang Anda tunjukkan, kebutuhan untuk memperpanjang kelas induk jelas merupakan kerugian.

Saya mempertimbangkan untuk membuat kode opsi tema Twenty Eleven kelas, tetapi tidak pernah berhasil melakukannya. Fungsionalitas yang terpisah dan mirip-plugin semacam itu tampaknya merupakan kandidat yang bagus untuk enkapsulasi.


Terima kasih atas jawabannya, Nacin. Saya belum memikirkan kesulitan dalam "melepaskan kaitan" dengan kelas. Mengenai enkapsulasi opsi - kami telah memikirkan hal yang sama: github.com/jestro/struts
Andy Adams
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.