우리는 Singleton 이 얼마나 나쁜지 알고 있습니다. 그 이유는 의존성과 다른 이유로 숨기기 때문 입니다.
그러나 프레임 워크에는 한 번만 인스턴스화 하고 모든 곳에서 호출해야하는 많은 객체 (로거, DB 등)가있을 수 있습니다.
이 문제를 해결하기 위해 서비스 (로거 등)에 대한 모든 참조를 내부적으로 저장하는 소위 "개체 관리자"(또는 심포니와 같은 서비스 컨테이너 ) 를 사용하라는 지시를 받았습니다.
하지만 서비스 제공 업체가 순수한 싱글 톤만큼 나쁘지 않은 이유는 무엇입니까?
서비스 공급자는 종속성도 숨기고 첫 번째 인스턴스 생성을 래핑합니다. 그래서 싱글 톤 대신 서비스 제공 업체를 사용해야하는 이유를 이해하기 위해 정말 고심하고 있습니다.
추신. 종속성을 숨기지 않으려면 DI를 사용해야한다는 것을 알고 있습니다 (Misko가 말한대로)
더하다
나는 추가 할 것이다 : 요즘 싱글 톤은 그렇게 사악하지 않다. PHPUnit의 제작자는 여기에서 설명했다.
DI + Singleton은 문제를 해결합니다.
<?php
class Client {
public function doSomething(Singleton $singleton = NULL){
if ($singleton === NULL) {
$singleton = Singleton::getInstance();
}
// ...
}
}
?>
이것이 모든 문제를 전혀 해결하지 못하더라도 꽤 똑똑합니다.
DI 및 서비스 컨테이너 외에이 도우미 개체에 액세스 할 수있는 좋은 솔루션이 있습니까?