Возможная проблема циклических зависимостей в приложении PHP - PullRequest
7 голосов
/ 12 октября 2008

Я испытываю проблему круговой зависимости с моим PHP-приложением. Пожалуйста, дайте мне знать, если это неправильно. Вот ситуация:

Два класса, LogManager и DBSession.

DBSession используется для взаимодействия с базой данных, а LogManager используется для регистрации в файлах. Оба широко используются в моем приложении. Когда вы создаете экземпляр DBSession, вы должны дать ему экземпляр LogManager через параметр конструктора. Это потому, что DBSession иногда записывает информацию в файл и использует для этого экземпляр LogManager.

Теперь я хотел расширить LogManager, чтобы он мог также регистрироваться в таблице базы данных, а не в текстовом файле. Естественно, я предпочитаю повторно использовать существующие классы, но вскоре я понял, что это привело к интересной ситуации.

Для DBSession уже требуется экземпляр LogManager для построения. Если я хочу повторно использовать класс DBSession в LogManager, ему теперь потребуется экземпляр DBSession. Как я могу удовлетворить оба требования? Очевидно, что-то должно быть не так с моим подходом.

Как бы вы посоветовали мне это исправить?

Заранее спасибо, ребята.

Ответы [ 4 ]

8 голосов
/ 12 октября 2008

Не расширяйте LogManager, пусть это будет агрегатный тип. И отложите выбор места, где вы хотите войти, т.е.

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

Где, конечно, FileLog и DBLog имеют общий интерфейс. Это приложение шаблона Observer, где add () - это операция «подписки», а FileLog / DBLog - наблюдатели событий регистрации. (Таким образом, вы также можете сохранять журналы во многих местах.)

Редактирование Owen : скорректирован на синтаксис php.

2 голосов
/ 12 октября 2008

Зачем требовать объект LogManager для создания объекта DbSession, если он только иногда записывает в файлы? ленивый груз вместо этого только тогда, когда вам это нужно. Кроме того, по моему мнению, оба должны быть независимы друг от друга. Каждый мог при необходимости создать экземпляр другого.

2 голосов
/ 12 октября 2008

Один из этих объектов на самом деле не нуждается в другом: вы уже догадались, это DBSession. Измените этот объект так, чтобы регистратор мог быть присоединен к нему после постройки.

1 голос
/ 12 октября 2008

Может быть, вы можете применить какой-то шаблон, например Singleton Pattern , чтобы убедиться, что у вас есть только один экземпляр вашего класса LogManager, например.

...