Nesneye yönelik PHP’de sınıf mirasına giriş

Nesneye yönelik PHP’de miras, diğer sınıfları genişleten ve özelliklerinin bir kısmını veya tamamını alan sınıflar oluşturma yeteneğidir. Bu, PHP’de (OOP PHP) nesne yönelimli programlamanın en kullanışlı işlevlerinden biridir. PHP’deki OOP ile ilgili en son makalelerimde bir lanet okudum, ancak bu makalede, sınıf mirası, nasıl kullanılacağı ve neden önemli olduğu hakkında daha fazla bilgi görmek istiyorum. Birinci sınıf mirası çok büyük bir WordPress eklentisi yazmaya çalıştım, dört farklı yazı türünü ele alan dört ana sınıfım var. Bu dört sınıfın bazı farklılıkları vardır, ancak bunları bir sınıfta yazarak ve daha sonra diğer iki sınıfa kopyalayıp yapıştırarak bazı benzerliklere sahiptir.
O zaman başarılı görünse de, tam anlamıyla kopyalanan ve dört farklı yere yapıştırılmış bazı hatalar yaptığımı fark ettim. Bu sorunun üstesinden gelmek için dört kez değişiklik yapmalıyım. Ve gelecekte ihtiyaç duyulan değişiklikler varsa, dört yerde değişiklik gerektirecektir. Çok kötü. Neyse ki benim için, Carl Alexander’ın miras ve soyut sınıflar hakkındaki makalesini okudum, bu da bunu nasıl doğru yapacağını gösterdim. Bu makale, daha iyi bir kod yazmaya, daha fazla yeniden kullanılmaya ve başkalarının kodunu daha verimli bir şekilde ayarlayabilen nesne yönelimli PHP’deki sınıf mirasına temel bir giriş sağlar.
Eklentiler veya kütüphaneler size kopyalamak ve bir yöntemi değiştirmek yerine neredeyse mükemmel bir sınıf verdiğinde, sınıfı genişletebilir ve yöntemi değiştirebilirsiniz. Neredeyse iki aynı sınıfınız olduğunda, temel bir sınıf yazabilir ve ardından iki kez genişletebilirsiniz. Sınıfı genişletmek ve bildirimde “Genişler” anahtar kelimesini kullanarak genişletilmiş bir sınıfın değiştirilmesi. WP_Query’yi genişletmek istiyorsak, sınıfımıza “Product_query WP_QUERY” ile başlayacağız. Her sınıf, son anahtar kelime ile bildirilmedikçe genişletilebilir. Bir sınıf genişletildiğinde, bunu bir üst sınıf ve alt sınıfa genişletilen sınıfı düşünüyoruz. Sınıf mirasını düzgün bir şekilde kullanmak, burada derinlemesine tartıştığım yöntemin mülkiyeti ve görünürlüğünün güçlü bir şekilde anlaşılmasını gerektirir. Bir alt sınıf ana sınıfla aynı şekilde başlar. Örneğin, bunu Product_query sınıfımız için yeni yazdıysak, wp_query: ürün_query ile aynı olacak wp_query {} elbette, hiçbir şey üretmez. Öte yandan, ürün postası türünde yayınlamak için çok fazla kuyruk gerektiren projeler üzerinde çalışıyorsak, bu sınıfla çeşitli şeyleri basitleştirebiliriz:
Class Product_query genişleyen wp_query {
Genel işlev __Construct ($ sorgu) {
$ query [‘post_type’] = ‘ürün’;
ebeveyn :: __ yapı ($ sorgu);
}
} Bu sınıf aynı WP_Query kurallarını takip eder, ancak sadece ürün yayınları istediğimizi söylemeye devam etmemiz gerekmez. Ayrıca, onunla yapılan nesnenin ürün direkleri için olduğu açıktır. İnşaata daha fazla ayar ekleyebiliriz. Ek sınıfımda __Construct () adlı bir işlev yaptığımı ve WP_Query’nin de bir yapıcı ilan ettiğini unutmayın. Herhangi bir yöntem – mucizevi ya da değil – alt sınıfta değiştirilebilir, ancak yine de “ebeveyn” anahtar kelimesini kullanarak ana sınıf yöntemine erişebilirsiniz. PHP5’te yöntemi değiştirdiğini ve imzayı değiştirdiğini hatırlamanız gerekir – parametreyi veya türü değiştirebilir – Standart bir bildirimi sıkıca tetikleyecek ve PHP7’de uyarıları tetikleyecektir. Bunu yapamazsınız çünkü kodu okumayı zorlaştırır. PHP7’de Dönüş Türü bildirimi kullanırsanız, alt sınıfta gerçekleştiğinde dönüm yönteminin türünü değiştirmeyin veya ölümcül hata oluşur. PHP5, dönüş türünün beyanını desteklemez. İyi sınıf mirası örnekleri, WP-ANCULKUD/REST-API dizinde bulunan, ancak tüm HTTP yanıtları için kullanılabilen WP_HTTP_RESPONSECT sınıfıdır. API REST’nin isteğine yanıt verirken özellikle kullanılan WP_REST_RESPONSECT sınıfı tarafından genişletildi.
Sınıf hariç soyut sınıf, final hala genişletilebileceğinden beyan edilir. PHP, doğrudan kullanılamayan sınıflar için soyut sözleşmeler sağlar ve sadece onları genişleten diğer sınıflar için temel sınıflar sağlamak için hareket eder. Soyut sınıftan bir başka özel kural da, sınıf tarafından genişleyen veya hataların oluşacak üzerine yazılması gereken soyut bir yönteme sahip olabilmeleridir. Bu çok kullanışlı bir sistemdir, çünkü alt sınıfın nasıl çalışacağını belirlemenize olanak tanır. Soyut yöntemler içeriğe sahip olmamalıdır ve bu, imzayı değiştirmemelidir. PHP5 veya PHP7’deki parametre parametresini veya türünü değiştirmeye çalışırsanız, ölümcül hatalar oluşacaktır.
Bu, bastırıcı olmayan yöntemleri değiştirmekten biraz farklıdır, ancak pratikte aynıdır, çünkü bir yöntemin imzasını değiştirmemelisiniz, ancak PHP5’te sıkı standartlar devre dışı bırakılmış olarak yapabilirsiniz. Arayüz benzer bir rol verir, ancak soyut yöntem herkese açık, korunan veya kişisel olabilirken arayüz yöntemi herkese açık olmalıdır. Soyut yöntemin yerini alan yöntem de aynı imzayı kullanmalıdır. WP_REST_Controller WordPress Rest API, soyut sınıfın iyi bir örneğidir. Bu, son nokta sınıfının nasıl çalışması gerektiğine dair standart bir sistem sağlamak için tüm uç noktalarla genişletilir.
Soyut yöntem daha uzun bir PHP versiyonunda desteklenmediğinden soyut yöntemi kullanmadığını unutmayın. Bunun yerine, temel sınıfın __doing_it_wrong () adını veren bir yöntem vardır. Bu, yöntemi genişletmeye zorlamak için bir çözümdür. Diğer örnekler için, OAuth aracılığıyla sosyal ağlara bağlı bir eklenti düşünelim ve daha sonra kamu ve gizli anahtarları daha sonra kullanacak. Gerçek anahtar farklı olacağından, bunun için farklı bir koda ihtiyacımız var, ancak kod tekrar depolamak ve bir anahtar almak için kullanılabilir. Böylece, soyut yöntemde gerçekleşecek bir anahtar almak dışında her şeyi işleyen “bağlantı” adlı soyut bir yöntem yazabiliriz. Sosyal soyut sınıf {

$ Public tarafından korunmaktadır;
korumalı $ gizli;
Genel işlev __Construct ($ public, $ gizli) {
$ this-> public = $ genel;
$ this-> gizli = $ gizli;
}
Soyut genel işlev connect ();
Genel işlev get_public () {
Dönüş $ this-> public;
}
Genel işlev get_secret () {
Dönüş $ this-> gizli;
}
} Bu, kod yedekliliğini azaltır ve bu sınıfı genişleten tüm sınıfların anahtar almak için aynı yönteme sahip olduğu ve her bir alt sınıftan bu yöntemi güvenli bir şekilde çağırabileceği koddaki belirli kalıplar uygular.
Örneğin, “Twitter” adlı bir sınıf ve bu sınıfı genişleten So -“Facebook” oluşturabiliriz. Her ikisinin de Connect adlı bir yönteme ihtiyacı vardır. Bağlantı yöntemi mevcutken, varlığını varsayabilir ve aynı şeyi yapmak için iki veya daha fazla sınıf kullanabiliriz: Facebook sınıfı sosyal olarak genişler {
Bağlı genel işlev () {// Halka açık bir gizli anahtar almak ve doğru mülkte ayarlamak için birkaç şey yapın
}
}
Twitter sınıfı Social’ı genişletiyor {
Bağlı genel işlev () {
// Halka açık bir gizli anahtar almak ve doğru mülkte ayarlamak için bazı şeyler yapın
}
}
Foreach ([‘twitter’, ‘facebook’] $ social_network olarak) {
/** @var sosyal $ obj*/
$ obj = yeni $ social_network;
$ obj-> connection ();
Update_option (‘public_’. $ Social_network, $ obj-> get_public ());
Update_option (‘Secret_’. $ Social_network, $ obj-> get_secret ());

admin

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir