Son kullanıcı gizle sınıf bağımlılıkları onu başlatmasını (PHP)

2 Cevap php

Benim durum aslında şudur: Ben bir kütüphane iç tüm bunların bağımlılıkları A ve B olan Foo adında bir sınıf var. Foo Örneklerini kütüphane kullanıcı tarafından yaratılacak ve onlar bağımlılıkları bilgi gerektiren olmamalıdır.

Yerinden tabii ben basit bir statik fabrika sınıfı düşünmüştü A ve B somut uygulamalardan ayrılmış kalmasını Foo istiyorum, ancak bağımlılıkları için bir şekilde bu yapılandırma (diyelim Fabrikası :: $ _staticAttr = x) için gerekli olacaktır aslında benim statik sınıf bir devlet vardır anlamına gelir gibi ve bu yanlış görünüyor.

Ben de bazı XML düşünüyordum ya da başka bağımlılık enjeksiyon konteyner yapılandırılmış, ancak daha sonra bir kayıt nesnesi içinde olması gibi dağınık bir şey olmadan yapılandırılmış DIC örneği erişilebilir yapmak için nasıl sorusunu gündeme ettik.

Kütüphane içinde gizli bağımlılıkları vb tüm ayrıntıları tutarken, enjekte her şeyi ile Foo bir örneğini oluşturmak için son kullanıcı için bazı önemsiz yöntemi için gayret ediyorum.

Etrafa okudum ve çözüm gerçekten henüz bana açıkçası kendini vermiş değil, bu yüzden :) herhangi bir giriş takdir ediyorum.

2 Cevap

I myself use a dependancy injection container (a static factory) for these things. Consider reading this post: http://www.potstuck.com/2009/01/08/php-dependency-injection/

I'm striving for some trivial method for the end user to generate an instance of Foo with everything injected, while keeping all the details of dependencies etc hidden within the library.

Ben kesinlikle bu durumda bir fabrika için giderdim.

UPDATE

That's what static classes are for. They represent a certain state, as in this case. You only need one db adapter (per application|class|package), so you can reuse the same one again and again. Using global would be a lot more hackyish ;)

Cevabınız için teşekkürler.

Mm, ben bu makale dün havasından okuyun. Benim tek sorun oldu:

`Factory::$_database = $ourDatabaseVarForDB1;`

Uygun olsa da, uygulama bu tür yapmak için bir hacky şekilde biraz olarak beni vurur?

Ancak diğer kutuları işaretleyiniz, bu yüzden daha iyi bir durum varsa bu şekilde olması gerekir.