WordPress’te sektörel problemleri çaprazlamak için bir çözüm olarak statik yöntem
Son zamanlarda PHP geliştirme için nesne odaklı programlama (OOP) hakkında çok yazdım. Vurgulamaya çalıştığım şeylerden biri, sınıfı kullanmanın OOP kodunu yapmadığı ve her zaman daha iyi kullanmamasıdır. OOP, yeniden kullanılabilecek nesneler yapmak için sınıfın kullanımını içerir. Sınıfı sık sık OOP’un çekirdeğini kaybeden bir isim alanı olan bir fonksiyon koleksiyonu olarak kullanırız. Ancak bu, tüm kodların “gerçek OOP” olması gerektiği anlamına gelmez. Kimse web sitenizi açmaz veya başvurunuzu yüklemez ve “Dang, gerçekten oop” diyor. Çalıştığını ve performans göstermesini önemsiyorlar. Bir geliştirici olarak, bu aynı zamanda endişeniz. Ancak bunun test edilebileceği, yeniden kullanılabileceğini ve öznitelikler listesinde yönetilebilecek ekleme önemlidir ve genellikle OOP bunu başarmamıza yardımcı olur.
Çoğu zaman bu hedeflere ulaşmaya yardımcı olan iyi yazılım tasarımı ilkelerini dengelemek, bir şeylerin iyi çalışması ve iyi çalışması gerekmesi her zaman bir mücadeledir. Bu makalede, bazı pratik örneklerle çapraz sektörel sorunları tartışmak istiyorum. Bu örnekler statik yöntemler ve sınıf mülkiyeti hakkında konuşmalara yol açacaktır. İlk önce sınıftaki statik yöntemleri ve özellikleri tartışan yazdığım en son yayınları görmek isteyebilirsiniz, eğer bu kavram sizin için yeni ise, çapraz sektör endişeleri nedir? Nesneye yönelik kodu dikey bir hiyerarşi olarak görme eğilimindeyiz. Bir sınıf diğerini genişletir, üzerine inşa eder. Bununla birlikte, bazı görevler, kesme gibi, hiyerarşi boyunca yatay olarak birkaç sınıf hiyerarşisine kadar uzanır.
Birkaç uygulama bölümü için “çapraz sektörel kaygılar” geçerlidir. Klasik örnek günlüğe kaydetme. Bu, birçok sınıfta kullanılması gereken bir görevdir. Tüm sınıflarda aynı günlükleme yöntemini keserek ve ekleyerek kendimizi tekrarlamak istemiyoruz, bu nedenle içindeki günlükleme yöntemi olan tüm sınıflar tarafından genişletilen temel bir soyut sınıfı yapmaya cazip gelebiliriz. Bu, sınıf uzantılarının kötüye kullanılmasıdır ve hızla dağınık hale gelir. Başka bir yaklaşım, herhangi bir sınıfta bulunmayan işlevlere giriş yapmaktır. Bu başarılı olabilir, ancak işlevin çok fazla sınıf yeteneği yoktur – görünürlük, mülk, vb. Logging sistemi için işlevleri kullanmak, sınıf yerine büyük bir işlev üretecektir ve belki de küresel. Daha iyi bir yaklaşım, günlüğe kaydetmeyi işleyen tüm statik yöntemlerin sınıflarını kullanmaktır. Önbellekleme başka bir genel haç sorunudur. Örneğin, uygulama boyunca WordPress nesne önbelleği kullanılır. Nesne önbelleği $ wp_object_cache global değişkeninde izlenir ve bu değişkenle çalışan birçok işlev vardır. Global kullanmak ideal değildir, ancak tüm uygulamalar aracılığıyla değer önbelleğini izlemeye hizmet eder. Örnek: Silinen kancaları izleme pratik bir örnek olarak, tüm aramaları belirli bir kancada geri silmeniz gerektiğini düşünün. Bunu Remove_all_filters () () işleviyle yapabilirsiniz. Peki ya tekrar eklemeniz gerekebilirse? Yazmadığınız eklentiler ve temalardan da dahil olmak üzere aynı add_action/add_filter () çağrısını yeniden yazmalıdır.
Daha iyi bir yol, kaydedilen eylem notlarını kaydetmek ve daha sonra kolayca geri yüklemek, depolanan notları kullanmaktır. Bu, küresel değil, bu not olarak hareket edecek bir sınıf mülkiyeti olmak istediğim bir değişkene ihtiyacımız olduğu anlamına geliyor. Böyle bir sınıf yapmanın iki yoluna bakalım. Bu, statik yöntemi kullanmayan birincisidir: sınıf silgi {/**
* İzle İlgili Yardım
*
* @var dizisi
*/
korumalı $ silined = [];
/**
* Daha sonra geri ekleme yeteneğiyle kancadaki tüm arka aramaları kaldırın
*
* @param String $ Hook Hook Adı
*/
Genel işlev remove_all ($ kanca) {
Global $ wp_filter;
if (isset ($ wp_filter [$ hook])) {
if (class_exists (‘wp_hook’))) {
$ all = klon $ wp_filter [$ hook];
} değilse {
$ all = $ wp_filter [$ hook];
}
İf (! Boş ($ all)) {
$ this-> kaldırıldı [$ hook] = $ all;
remove_all_filters ($ kanca);
}
}
}
/**
* Kancadan silinen tüm arka aramaları ekleyin
*
* Silmek için $ this-> remove_all () kullanmalı
*
* @param String $ Hook Hook Adı
*/
RE_ADD genel işlevi ($ hook) {
if (isset ($ this-> kaldırıldı [$ hook])) {
$ Hook = $ this-> silindi [$ hook];
İf (! Boş ($ kanca)) {
if (class_exists (‘wp_hook’))) {
$ öncelikleri = $ hook-> geri arama;
} değilse {
$ öncelik = $ bağımlılık;
}
Foreach ($ öncelikleri olarak $ öncelik => $ geri arama) {
foreach ($ callback olarak $ geri arama) {
add_filter ($ hook, $ callback [‘işlev’], $ öncelik, $ callback [‘circeded_args’]);
}
}
}
}
}
} Bu durumda, bu nesnenin bir örneğini oluşturmalı ve ardından uygulama boyunca izlemeliyiz. Bu önemlidir, çünkü bu nesnenin her örneği $ kaldırılmış özelliğinde farklı bir kancaya sahip olacaktır. Bu iyi olabilir. Bu sınıf örneğini, daha sonra yükleme seçeneği ile kancayı serbest bırakması gereken herhangi bir sınıfa sunabilirsiniz. Bu, tüm uygulamalarda aynı sınıftan birçok örnek gerektirecek olan bu yaklaşım için büyük bir avantaj olmadığını söylüyor. Aslında, bu sadece bir örneğe sahip olmaktan daha az kullanışlıdır. Global bir değişken veya tek bir desen aramadan önce, bu sınıfın statik yöntemler ve statik özellikler kullanılarak yeniden yazıldığını görelim: <? Php
Sınıf silgi {
/**
* İzle İlgili Yardım
*
* @var dizisi
*/
korumalı statik $ kaldırıldı = [];
/**
* Daha sonra geri ekleme yeteneğiyle kancadaki tüm arka aramaları kaldırın
*
* @param String $ Hook Hook Adı
*/
Statik genel işlevi kaldır ($ kanca) {
Global $ wp_filter;
if (isset ($ wp_filter [$ hook])) {
if (class_exists (‘wp_hook’))) {
$ all = klon $ wp_filter [$ hook];
} değilse {
$ all = $ wp_filter [$ hook];
}
İf (! Boş ($ all)) {
Self :: $ kaldırıldı [$ Hook] = $ All;
remove_all_filters ($ kanca);
}
}
}
/**
* Kancadan silinen tüm arka aramaları ekleyin
*
* Silmek için $ this-> remove_all () kullanmalı
*
* @param String $ Hook Hook Adı
*/
Statik genel işlevi RE_ADD ($ Hook) {
if (isset (self :: $ kaldırıldı [$ hook])) {
$ hook = self :: $ kaldırıldı [$ hook];
İf (! Boş ($ kanca)) {
if (class_exists (‘wp_hook’))) {
$ öncelikleri = $ hook-> geri arama;
} değilse {
$ öncelik = $ bağımlılık;}
Foreach ($ öncelikleri olarak $ öncelik => $ geri arama) {
foreach ($ callback olarak $ geri arama) {
add_filter ($ hook, $ callback [‘işlev’], $ öncelik, $ callback [‘circeded_args’]);
}
}
}
}
}
} Burada statik yöntemler ve mülkiyet hakkında hatırlanması gereken önemli şey, sınıf örnekleri oluşturmadan erişilebilmeleridir. Bu, $ kaldırılmış statik özelliği kullanan Remover :: Remove_all () kullandığımızda, örnek izleme hakkında endişelenmemize gerek yok ve Remover :: re_add () daha sonra kullanmaya döndüğümüzde, aynı üzerinde arama yapacak Tracked kancalar için $ kaldırılmış özellik.
Şimdi, temelde küresel bir değişken kullanmadan kancamın kaldırılmasını izlemek için küresel bir sistemim var. Aynı küresel olanı başka şekillerde kullanan eklentiler veya diğer temalar veya diğer temalar veya $ kaldırılmış mülk istismarı hakkında endişelenmem gerekmiyor, çünkü oraya erişim sınıfım tarafından kontrol ediliyor. Sorunları Çözme Bu makalede, çapraz sektörel kaygılar kavramını tanıttım. Ayrıca, basit işlevlerden daha fazlasını gerektiren sektörel sorunları çaprazlamak için bir çözüm olarak tüm statik yöntemlerle sınıf hakkında konuşuyorum. Amaç, prensibe göre prensibe uymamak, gereksiz teknik borç oluşturmadan sorunları çözmektir.