PHP sınıfları: Need help iki sınıf miras

6 Cevap php

Ben çok sınıftaki genişletmek gerekiyor benim PHP sınıfları tasarımı yardıma ihtiyacım var.

Ben pagination ve sıralama her tür yok genel bir sınıf, Pagination.php var. Diğer tüm sınıflar sayfalandırmada kullanacağız.

Hayatımı kolaylaştırmak için, ben MySQL tablosundan bir sınıf oluşturur bir sınıf jeneratör yaptı. Tüm özellikleri, alıcılar, belirleyiciler ve yaygın yöntemler gerçekten zaman ve para kazandırır, otomatik olarak oluşturulur.

Bir örnek olarak, Staff_Base.php sınıf Staff_Base SQL tablo t_staff otomatik olarak oluşturulur.

Sınıf Staff_Base otomatik olarak SQL tablosundan oluşturulan bu yana, herhangi bir 'özel' yöntemler / özellikler Staff_Base.php genişleten başka bir sınıfta yer almaktadır. (Yeni bir alan ilave olduğunda Böylece, ben sadece Staff_Base sınıfını yeniden ve Staff_Base.php in üzerine yazabilirsiniz).

Yani Staff_Base.php genişleten sınıf Staff.php var.

The problem is, Staff.php also needs to extend another class, Pagination.php. (The current workaround is to put methods in Pagination.php into every class. This is really troublesome whenever I make changes to the pagination/sorting methods.)

How do I do this? What is the best design pattern to achieve this?

Ben sınıfları yeniden ortak önerileri biliyorum, ama gerçekten başka çözüm / çözümün zor düşünüyorum. Ayrıca, ben de Pagination.php dışındaki sınıfları uzatmak gerekebilir.

Teşekkürler!

6 Cevap

Ben o sınıf varsayılan Sayfalandırmayı genişletmek yapmak için Staff_Base.php jeneratör değişen öneriyoruz. Bu şekilde Staff Staff_Base uzanır ve Staff_Base uzanan Pagination. Ben muhtemelen temiz (ve çoğu nesne yönelimli) istediğiniz sonuçları elde yolu olduğunu düşünüyorum.

Eğer Numaralandırma sizin oluşturulan Staff_Base sınıf miras alabilir miyim? Ya Staff_Base zaten (siz kontrole sahip değilsiniz) başka temel sınıfından geliyor ...

Doktrin veya uskur ya gibi, ben * _Base sınıf sistemini kullanan hatırlamıyorum sesler.

Benim önerim bunun yerine genişletmek için varlık sınıfları gerektiren sizin varlık sınıfları tarafından kullanılmak üzere muktedir sayfalandırma yeniden yazmak olacaktır.

Eğer varsa her sınıfa paginate çoğaltarak 2 sınıfları miras alamaz beri Yani okuyorum eğer, doğru ne yazdı.

Sınıf istifleme bir çözümdür. I googled ilk şeylerden biri.

Eğer çoklu kalıtım php desteklenmediği, edemem, ama bu konuyla ilgili bir google arama yaparsanız bazı geçici çözümler bulabilirsiniz ...

Burada karıştırma şeyler gibi geliyor. (Böyle bir personel sınıf olarak) A sınıfı tek bir varlık temsil etmek için kullanılır. Örn:

$john = new Staff('John');

Tam olarak nasıl belleği bu sığacak? Sayfa-mümkün (paginatable?) Olmak bu değil işletmenin kendisi, bu Personel kuruluşlara erişim sağlayan ne olursa olsun bir özellik gibi geliyor. Bu şekilde, yolu temel sınıfından oluşturmak Personel sınıfının her tür için açıktır.

Peki, ben inanıyorum ne gerek çözüm olurdu:

  1. A Personel sınıfı (Staff_Base ve çocukların onun grafiği)
  2. Bir Personel Veri Erişim Nesnesi (Eğer ad kullanıyorsanız DAO \ Personel, güzel bir isim olurdu)
  3. Bir Arayüz, DAO disk belleği olabilir dünyaya sinyal

Unutulmaması gereken ithalat DAO sınıfı ve personel sınıf arasında doğrudan bir miras olmasıdır. Hala sürece bu sınıfın gerçek veri erişimi içermez gibi ... veritabanında kendi özelliklerine dayanarak Staff_Base sınıf oluşturmak ve oradan uzatabilirsiniz.

Bu kullanarak kod sonra bu gibi bir şey olacaktır:

 <?php
 $staffDao = new DAO\Staff;
 $staffMembers = $staffDao->getPagedResult($start, $amount);
 ?>

Edited to emphasize that the inheritance structure should be separate from the actual retrieval

Eh, zaten PHP çoklu mirası desteklemez biliyor olabilir. Mantığı her arayüzünün uygulanması için özdeş ise, bu sıkıcı hale gelebilir, her ne kadar tek yolu çevresinde, yerine sınıflarından Arayüzleri kullanıyor olabilirsiniz. Nasıl sadece her sınıfa yöntemlerini enjekte kod jeneratör, yazma hakkında? Zaten "ortak yöntemler" üzerinde yapmak gibi görünüyor.

Oh, ve PHP (bunlar örneğin Java kullanıldığı gibi) alıcı ve ayarlayıcıları kullanarak iyi bir fikir sayılmaz. Nesneler oldukları gibi yavaş, bu yüzden kamu alanlarını kullanarak norm olarak kabul edilir.

Edit: O __call()-hack aslında diğer sınıfların ikamet yöntemlerini tanımak ve bunları el diyebiliriz ki, var.