PHP uygulama ile olası döngüsel bağımlılık sorunu

4 Cevap php

Ben benim PHP uygulama ile dairesel bir bağımlılık sorunu olduğunu düşündüğümüz yaşıyorum. Bu yanlış varsa bana bildirin lütfen. İşte durum:

Iki sınıf, LogManager ve DBSession.

DBSession veritabanı ile etkileşim için kullanılan ve LogManager dosyalara oturum açmak için kullanılır. Hem yaygın benim uygulamada kullanılmaktadır. Eğer DBSession bir örneğini oluşturduğunuzda, bunu yapıcı parametre üzerinden LogManager bir örneğini vermek zorundadır. Bunun nedeni DBSession bazen bir dosyaya bilgi giriş olacak, ve bunu yapmak için LogManager örneğini kullanır.

Şimdi, ben de yerine bir metin dosyası daha, bir veritabanı tablosuna oturum böylece LogManager genişletmek istedim. Doğal olarak, benim tercih yeniden kullanımı mevcut sınıfları için, ama ben yakında bu ilginç bir durum getirdi gerçekleştirdi.

DBSession zaten inşaat için LogManager bir örneğini gerektirir. Ben LogManager yılında DBSession sınıfını yeniden kullanmak istiyorsanız, şimdi DBSession örneğini gerektirir. Nasıl ben de taleplerini tatmin edebilir? Açıkçası, bir şey benim yaklaşım yanlış olmalı.

Nasıl bunu düzeltmek önerirsiniz?

Şimdiden teşekkürler, çocuklar.

4 Cevap

LogManager uzatmak etmeyin, bir toplama türü olalım. Ve sen, yani oturum istediğiniz yerin seçim geciktirebilir:

$logManager = new LogManager();
$dbSession = new DbSession($logManager);
$logManager->add(new FileLog($filename) );
$logManager->add(new DBLog($dbSession) );

Where of course FileLog and DBLog share a common interface. This is an application of the Observer pattern, where add() is the "subscribe" operation, and FileLog/DBLog are the observers of logging events. (In this way you could also save logs in many places.)

Owen edit: php sözdizimi ayarlandı.

Belki size sadece örnek için LogManager sınıfının bir örneği olmasını sağlamak için Singleton Pattern gibi, bazı desen uygulayabilirsiniz.

Bu nesnelerin biri aslında diğer gerekmez: Eğer DBSession var, tahmin. Logger inşaattan sonra ona bağlı böylece o nesneyi değiştirin.

Neden sadece bazen dosyalarına yazar eğer, bir DbSession nesnenin oluşturulması için bir LogManager nesne talep? tembel yük yerine sadece ihtiyacınız olduğunda. Ayrıca, benim görüşüme göre hem birbirinden bağımsız olmalıdır. Gerektiğinde her örneği diğer yapamadım.