문제

싱글 톤을 의미하는 PHP (>= 5.0) 클래스를 작성하고 있다고 가정 해 보겠습니다.내가 읽은 모든 문서는 클래스 생성자를 비공개로 설정하여 클래스를 직접 인스턴스화 할 수 없도록합니다.

그러니까 이런 게 있다면 : 라코 디스

내가하는 경우 외에 __construct ()가 호출되는 경우가 있습니까 라코 디스

수업 내부에서 전화 하시겠습니까?

그리고 왜 SillyDB를 내부에서 인스턴스화 할 수 있습니까?

도움이 되었습니까?

해결책

__construct()는 private 생성자를 포함하는 클래스의 메서드 내에서 호출 한 경우에만 호출됩니다.따라서 Singleton의 경우 다음과 같은 방법이있을 수 있습니다. 라코 디스

자체 내에서 클래스를 인스턴스화 할 수있는 / 원하는 이유는 주어진 시간에 하나의 인스턴스 만 존재하는지 확인할 수 있기 때문입니다.이것은 결국 Singleton의 요점입니다.데이터베이스 연결에 싱글 톤을 사용하면 애플리케이션이 한 번에 많은 양의 DB 연결을 만들지 않습니다. <시간>

수정 : @ emanuele-del-grande가 제안한대로 $ 추가됨

다른 팁

다음은 날짜 / 시간 문자열을 생성하는 매우 간단한 싱글 톤입니다. 라코 디스

이렇게하면 분명히 같은 날짜가 계속해서 나옵니다. 라코 디스

이렇게해도 오류가 발생하지 않습니다. 라코 디스

알겠습니다. 몇 가지 테스트를 직접 실행했습니다.

  • 하위 클래스에서 자체 생성자를 선언하지 않은 경우 인스턴스화하려고하면 슈퍼 클래스 생성자를 호출하려고하므로 치명적인 오류가 발생합니다.
  • DB 연결의 경우, (어쨌든 PHP에서) mysqli 인스턴스 또는 mysql_connect() 함수 (또는 다른 RDBMS에 대한 다른 링크)에 의해 반환 된 리소스를 반환 할 때인스턴스 비공개, 누군가 하위 클래스를 만들고 링크를 조작 할 위험이 없습니다.
  • 이전에 언급했듯이 누군가가 정말로 당신의 행동을 재정의하고 여러 연결을 만들고 싶다면 새 클래스를 작성하여 그렇게 할 수 있습니다.

코드를 테스트 해보세요. Mark, 찾은 내용을 알려주세요.

편집 : 또한,이 특정 상황에서 사람이 서브 클래 싱하는 것을 방지하는 데 관심을 가져야하는 이유를 잘 모르겠습니다.누군가가 당신의 PHP 코드에 접근하여 그것을 하위 클래스로 만든다면, 그들은 당신의 코드에 접근하여 그것을 복사하고 접근 수정자를 (어떤 이유로 든) 적합하다고 생각하는 것으로 변경합니다.

이 경우 Singleton의 실질적인 유용성은이를 사용함으로써 주어진 HTTP 요청에 대해 항상 동일한 데이터베이스 연결을 사용할 수 있다는 것입니다.그것은 그것을 달성합니다.다른 것 (final 및 private 생성자 사용)은 이론적 관점에서 아는 데 유용하며 API 품질 코드를 다른 프로그래머에게 배포 하려는지 여부를 아는 것이 훨씬 더 유용하지만이 특정 예제의 경우 모든 키워드클래스 파일의 크기에 바이트를 추가하는 것입니다.

간단한 선택 : 누군가이 클래스를 서브 클래 싱하고 자체 공개 생성자를 구현하는 것을 원하지 않기 때문에 완성도를 위해 클래스를 final로 선언 할 것입니다.

(컴파일러가 개인 생성자의 재정의를 포착하면 용서해주세요.하지만 그렇게 생각하지는 않습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top