Function.php içinde global işlevler yerine sınıfları kullanma


11

Gördüğüm birçok temada (TwentyEleven dahil) ve çevrimiçi bulduğum örneklerde, functions.phpbir tema için dosya oluştururken tüm işlevler küresel bir kapsamda bildirildi. Açıklığa kavuşturmak için, tipik bir işlev dosyası şöyle görünür:

function my_theme_do_foo() { // ... }

function my_theme_do_bar() { // ... }

add_action( 'foo_hook', 'my_theme_do_foo' );

Bana öyle geliyor ki bir sınıf kullanılmışsa işler biraz daha "kapsüllenebilir":

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

$my_theme = new MyTheme();

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

İkinci yaklaşımın avantajları (mütevazi gözlerimde):

  • Daha kısa işlev adları
  • Örnek değişkenlere erişim (en büyük avantaj IMO)
  • Global işlev yok

Dezavantajlar:

  • Sınıf adı yine de çakışmalara neden olabilir
  • Bir alt temayla "özelleştirmek" kadar net değil (bir ana sınıfı genişletmek zorunda kalacak)
  • Çoğu tema bu şekilde yapılmadı, bu yüzden eğilimi bozuyorsunuz

Muhtemelen bazı şeyleri gözden kaçırıyorum, ama neden OOP yaklaşımını benimsemediğimi merak ediyorum? Bir şey varsa, bana biraz "temiz" geliyor. Belki yanılıyorum?

WordPress tema geliştirme konusunda oldukça yeniyim, bu yüzden bu WP topluluğunda ortak bilgi ise beni affet :). Sadece neden böyle olduklarını öğrenmeye çalışıyorum.


Temaları Kovshenin'den kontrol edebilirsiniz - wordpress.org/extend/themes/profile/kovshenin fonksiyonlarda OOP yaklaşımını kullanıyor.
Php

Yanıtlar:


9

Kapsülleme için bir sınıf kullanmak, eklentiler için bir dizi geliştirici tarafından çok yaygın bir yaklaşımdır. Bunu yapıyorum ve daha temiz buluyorum. Ancak eklentiler için. Temalar doğası gereği daha prosedüreldir.

Varsayılan WordPress temaları için bunu yapmıyoruz, çünkü giriş engelini kaldırıyor. Fonksiyonlar oldukça basit. Sınıflara bağlı eylemleri kaldırmak zor olabilir (ve belirli durumlarda potansiyel olarak hatalı olabilir).

Ayrıca, varsayılan temalardaki bir dizi işlev takılabilir. Bir sınıfı genişletmek ve yöntemleri değiştirmek, sadece işlevi tanımlamaktan çok daha karmaşıktır. Kodun iki farklı yönü farklı işlevlerin yerini alabilse de, sınıfları dinamik olarak genişletemezsiniz. Belirttiğiniz gibi, bir ebeveyn sınıfını genişletme ihtiyacı kesinlikle bir dezavantajdır.

Twenty Eleven'ın tema seçenekleri kodunu bir sınıf haline getirmeyi düşündüm, ama hiç bir zaman bunu başaramadım. Bu tür ayrı, eklenti benzeri işlevsellik kapsülleme için iyi bir aday gibi görünüyor.


Cevabınız için teşekkürler, Nacin. Sınıflarla "çengel açma" eylemlerinin zorluklarını düşünmemiştim. Seçenek kapsülleme ile ilgili olarak - aynı şeyi düşünüyoruz: github.com/jestro/struts
Andy Adams
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.