Singletons are glorified global variables. 디자인 패턴은 전역 변수가 어렵거나 불가능한 언어 또는 나쁜 실행으로 간주되는 언어에 맞게 만들어졌습니다. 실제로 대부분의 일반적인 디자인 패턴은 제한된 언어 용으로 설계되었으며 대부분 다른 언어에서는 불필요합니다.
PHP에는 전역 변수가 있습니다. PHP 전역 변수는 일반적으로 나쁜 습관이지만, 필요하다면 존재합니다.
그러나 PHP에서 싱글 톤을 원한다면 몇 가지 이유가 있습니다.
싱글 톤은 getInstance
(싱글 톤의 단일 인스턴스를 반환하는 메서드의 정식 이름)을 호출 할 때 스크립트의 어느 지점에서나 만들 수 있습니다. 그 시점까지는 객체가 존재할 필요가 없습니다. 객체가 대신 전역 변수 인 경우 이미 존재해야하거나 객체를 참조하려는 코드가 먼저 객체를 인스턴스화해야합니다. 실제로, 그것이 사용될 수있는 곳이라면, 올바르게 인스턴스화 될 필요가 있습니다. getInstance
에 단일 개체 생성을 중앙 집중화함으로써 개체를 참조해야 할 때마다 복사하여 붙여 넣기하는 상용구를 작성하지 않아도됩니다.
데이터베이스 개체 보통은 요청 수명에서 매우 일찍 생성되므로 Singleton-ness의 특정 이점이 낭비됩니다.
다른 방법으로 작업을 수행 할 수있는 Singleton의 다른 대안이 있습니다. 예를 들어, dependency injection은 새로운 객체가 생성하는 외부 객체 (예 : 데이터베이스 핸들)를 객체에 전달할 때 사용하는 멋진 용어입니다. 그러나 이것은 복잡하거나 성가심 일 수 있습니다. 이 작업을 올바르게 수행하려면 같은 개체를 매번 주입해야합니다.
또 다른 대체 방법은 Registry pattern입니다.이 방법은 사실 전역 변수가되는 항목의 컨테이너입니다. 전역 변수가 마음에 들지 않지만 효과적으로 네임 스페이스가되는 것을 꺼리는 경우, 이는 원하는 해결책이 될 것입니다.
마지막으로 코드를 작성하는 한 가지 방법을 선택하고 코드베이스 전체에 일관되게 적용하십시오. 개인적으로 저는 데이터베이스 객체의 팬입니다.
2 개 이상의 데이터베이스에 동시에 연결할 수있는 기능을 가지고있다. 또한 싱글 톤은 클래스에서 사용되므로 자동로드를 사용할 수 있습니다. Singleton이 PHP에서 데이터베이스 처리에 좋지 않다고 나는 믿지 않는다. – Savageman
매우 사실입니다. 코드와 데이터베이스 사이에 포괄적 인 캐싱 계층이 있다면 적어도 어느 정도는 연결을 열 필요가 없을 수도 있습니다. – Charles
테스트에 대한 요지는 매우 유효합니다. 싱글 톤의 가장 큰 문제점은 단일 인스턴스 (dbs를 분리하는 데 두 개의 별도 db 연결은 어떻게됩니까?)뿐만 아니라 특정 구현에만 제한된다는 것입니다. 테스트하고 싶다면 db 연결을 다른 것으로 바꿔야합니다. 추상화는 싱글 톤을 확장 할 수 없으므로 더욱 어려워집니다. 레지스트리는 이러한 많은 문제를 해결합니다. – igorw