PHP Sanal Fonksiyonlar Doğru Uygulama?

3 Cevap php

benim çalışma yerinde (php sadece) biz veritabanı soyutlama için bir temel sınıf var. Eğer temel tabakası için yeni bir veritabanı tablo eklemek istediğinizde, bu taban sınıfının bir alt sınıfı oluşturmak ve bu tablo kullanarak bireysel davranışını tanımlamak için bazı yöntemleri geçersiz zorunda. Normal bir davranış aynı kalmalıdır.

Şimdi sadece varsayılan davranış yöntemini geçersiz firmamız birçok yeni programcılar, gördük. Bazı tüm varsayılan davranış koymak ve sadece başkalarının baseclass ve onların mirasçısı kullanmaya çalışıyorum kendilerini öldürmek, orada onlar gibi bireysel şeyler eklemek çok "güzel" dir.

Bu sorunu çözmek için benim ilk düşünce, sınıfları devralmasını ile değiştirileceğini gerektiği soyut yöntemler düşünüyordum. Fakat soyut yöntemlere karşı diğer argümanlar yanında, "arka plan", sadece why baseclass kendi tarafından kullanılamaz ve why Bu fonksiyonu overriden gerektiğini göstermez.

Bazı etrafında Googling sonra ben (bir sanal işlev neredeyse bir somut uygulama tüm umudunu öldürür, orada sadece) php "gerçek" sanal fonksiyonları uygulamak için iyi bir cevap bulamadık.

Peki, sen bu konuda ne yapardınız?

3 Cevap

PHP, tüm public ve protected fonksiyonları "sanal" dir. Sen final anahtar prepending ile değiştirileceğini olmaktan işlevlerini engelleyebilirsiniz. (Ya onları özel yapım, ancak bu muhtemelen kötü bir fikir).

In the design of the baseclass I would think of behaviors that subclasses would want to affect. I would for example create empty functions like before_update() and after_insert().

function after_insert() {
  // Virtual
}

Bir güncelleme / insert olayı meydana geldiğinde baseclass arayacak olan.

Her BaseClass gerçek verir, ve bir alt return false olduğunda sonuçları ne açıklamak için commentblock kullanmak belki bir is_valid () fonksiyonu.

Umarım bu size biraz ilham verecek.

Sen her zaman insanların yanlış bir şekilde sınıfını kullanarak eğer geçersiz kılınmasını sınıfları bazı işlevleri engellemek için "son" anahtar sözcüğünü kullanabilirsiniz.

Bu nedenle yöntemleri geçersiz belirli işlevleri başarmak mümkün gibi bana geliyor. Sen sınıfların tasarımı bakmak gerekebilir.

Baz sınıf uygulamasının bir örneği olmaksızın, somut bilgi vermek zor. Ama birkaç şey akla geliyor:

  1. Veritabanı soyutlama ile başlayan karmaşık şeyler. Ben temiz, yalın tutmak ve demek istediğinizi anlıyorum, ama ben oldukça lanetlemek zor olduğunu düşünüyorum. Eğer gerçekten parçalar genel nelerdir ve uzmanlık gerekenleri parçaları görmek için farklı DB motorlarının özellikleri de ayrıntılı bir bakmak gerekir. Ayrıca; Eğer taban sınıfını genişleterek DB tablo eklemeyi bahsediyoruz gibi, DB soyutlama Tablo Veri Ağ Geçidi deseni ile karışık yok emin misin?

  2. Mevcut taban sınıfın yöntemleri çok yapıyor ve / veya genişletilmiş sınıflar temiz tutmak çok geriye doğru eğilme ise, başlamak için yeterli genel değildir olabilir. Belki uzun sınıfların baskın yöntemleri yeniden için yeterince genel küçük korumalı yöntemleri temel sınıf arabirim yöntemleri kırmak gerekir? Ya da tam tersi: belki sizin arabirim yöntemleri geçersiz kılınabilir yöntemleri kanca olmalıdır.

  3. 2 noktasında aşağıdakilerden: Ne bazı genel uygulanan yöntemlerle soyut bir sınıf olan nesi var, ve vanilya sınıfı (Baz sınıf) ve diğer sınıflar devralan izin that?

  4. Son olarak, belki de sadece temel sınıf uzanan yerine, uygulanacak bir arabirim uygulamak gerekir?