2008-10-12 6 views
7

PHP 응용 프로그램의 순환 종속성 문제가 발생합니다. 이것이 틀린 지 알려주세요. 상황은 다음과 같습니다.PHP 응용 프로그램의 순환 종속성 문제가 발생할 수 있습니다.

두 개의 클래스, LogManager 및 DBSession.

DBSession은 데이터베이스와 상호 작용하는 데 사용되고 LogManager는 파일에 기록하는 데 사용됩니다. 둘 다 내 응용 프로그램에서 널리 사용됩니다. DBSession의 인스턴스를 만들 때 생성자 매개 변수를 통해 LogManager의 인스턴스를 제공해야합니다. 이것은 DBSession이 때때로 정보를 파일에 기록하기 때문에 LogManager 인스턴스를 사용하여이를 수행합니다.

이제 LogManager를 확장하여 텍스트 파일이 아닌 데이터베이스 테이블에도 기록 할 수있게하려고했습니다. 당연히, 나의 선호는 기존 수업을 재사용하는 것이지만, 나는 곧 이것이 흥미로운 상황을 가져 왔다는 것을 깨달았다.

DBSession에는 이미 생성을 위해 LogManager 인스턴스가 필요합니다. LogManager에서 DBSession 클래스를 다시 사용하려면 DBSession 인스턴스가 필요합니다. 어떻게하면 두 가지 요구를 모두 충족시킬 수 있습니까? 분명히, 나의 접근 방식에 뭔가 틀린 것이 틀림 없다.

어떻게 해결하겠습니까?

미리 감사드립니다.

답변

8

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 구문에 맞게 조정되었습니다.

+0

$ logManager = new LogManager(); $ dbSession = 새 DbSession ($ logManager); $ logManager-> add (새 FileLog ($ 파일 이름)); $ logManager-> add (새 DBLog ($ dbSession)); – micahwittman

+0

클래스 이름에 일관성이 없습니다. –

+0

@Owen : 편집 해 주셔서 감사합니다! –

1

Singleton Pattern과 같은 패턴을 적용하여 예를 들어 LogManager 클래스의 인스턴스 하나만 가질 수 있습니다.

2

이러한 개체 중 하나는 실제로 다른 개체가 필요하지 않습니다. 사용자가 추측 한대로 DBSession입니다. 구성 후 로거를 연결할 수 있도록 해당 객체를 수정하십시오.

2

DbSession 객체 생성을 위해 LogManager 객체를 요구하는 이유가 파일에만 기록되는 경우가 있습니까? 대신 필요할 때만 게으르십시오. 또한, 제 생각에는 둘 다 서로 독립적이어야합니다. 각각은 필요할 때 다른 인스턴스를 나타낼 수 있습니다.

+0

게으른 로딩 구현을 절대로 시도한 적은 없지만 권장 사항에 대해 감사드립니다. 나는 LogManager가 때때로 DBSession과 함께 사용되는 경우가 더 적절하다는 점을 인정한다. 감사! –

관련 문제