Teorik bir veritabanı erişimi sınıftayım, bağımlılık enjeksiyon kullanarak sınıfının örneğine ilişkisiz olarak manipüle edilebilir sınıfın örneği (ve diğerleri ilgisi yok ben sınıfta kullanmak epeyce yardımcı işlevler vardır bulundu .)
Örneğin, ben bir değişkene diğer iki dizeleri arasında bir dize alır bir işlevi var. Ben bir String_Helper sınıf veya tür bir şey bu hareket düşünüyordum. Bu fonksiyon, statik yapılmıştır.
Ayrıca, ben bir veritabanını sorgulayan bir işlevi var, query($sql)
. Bağlantı bilgilerini örneği tarafından sağlanan, ama ben statik yapma düşünüyor, ve query($sql, $connection)
kullanarak oldum. Geliştiriciler daha sonra tüm veritabanı sınıf örneğini gerek statik değil, onu aramak mümkün olacaktır.
Benim için, sorular şunlardır:
O böyle bir şey yapmak için değer mi? Sorgu işlevi gibi işlevler bu sadece benim için gerçek bir ihtiyaç olmadan, mümkün olduğunca statik her şeyi yapmaya çalışıyorum değilse beni merak yapmak. Hangi şartlar altında bu yararlı düşünün?
Elbette, ben statik fonksiyonları test etmek daha zor olduğunu biliyorum, ama ben kendi kod tamamen ücretsiz bağımlılık (veya bağımlılık enjeksiyon gerektiğinde kullanır) emin olursanız, o zaman her şey gibi test etmek gibi kolay değil mi?
O anda bir endişe değil, ama gelecekte, ben statik fonksiyonları ile sınıfları uzatma kararı, eğer bana geçerli kod benim genişletilmiş işlevleri kullanmak yapmak için, imkansız olurdu. Ben Singletons düşündüm, ama aynı sorun ortaya çıkar: Kod
Singleton_Class::getInstance()
çağırarak, veMy_Extended_Singleton_Class::getInstance()
olacaktır. Bağımlılık Enjeksiyon bu sorunu çözmek için tek yol gibi görünüyor, ama her bağımlılık__construct()
üzerine bir nesneye verilmesi gereken gibi, bir clunkier API yol açabilir.Ben komut (küresel kapsam) her yerde ulaşılabilir, böylece statik bilgilerin belirli parçalarını tutan bir kapsayıcı sınıfı var. Ben statik işlevleri veya singletons kullanamıyorsanız, farklı değişkenlerin örneklerini içeren bir sınıf harika olurdu. Bir
Container::$objects['MyClass'] = $MyClass_object;
, örneğin kullanabilirsiniz, ve sonra kod kalanı sadece erişimContainer::$objects['MyClass']
olabilir. Ben Sınıfım sınıfı genişletilmiş, benContainer::$objects['MyClass'] = $MyExtendedClass_object;
kullanabilirsiniz, ve kullanılan kodContainer::$objects['MyClass']
yerine Sınıfım daha MyExtendedClass kullanmak istiyorsunuz. Bu kadar benim görüşüme göre, bunu yapmak için en iyi yoldur, ama ben bu konuda ne düşündüğünüzü bilmek istiyorum.