저는 고객에게 암호화 된 코드를 제공 할 PHP 라이브러리를 개발 중입니다. 코드에는 라이센스 검증을 처리하고 메소드 사용 방법을 공개 할 수있는 인스턴스화 할 수있는 기본 클래스가 포함됩니다. 메인 클래스는 각각 자신의 파일에 포함 된 여러 하위 클래스를 인스턴스화합니다. 우리 고객이 하위 클래스 파일을 포함하지 않고 하위 클래스 자체를 인스턴스화하지 못하게하려면 어떻게해야합니까? 메인 클래스를 제외하고 하위 클래스가 인스턴스화되지 않도록하는 방법이 있습니까?원하지 않는 인스턴스 생성에서 PHP 클래스를 보호 하시겠습니까?
답변
추측 만의 싱글을 사용할 수 있습니다 메인 클래스, 모든 서브 클래스에 대한 의존성 주입 (메인 클래스의 factory/Singleton)을 포함한다. 그렇게하면 하위 클래스는 기본 클래스의 인스턴스에 대한 유효한 참조없이로드되지 않습니다.
편집 :이 답변이 승인 되었기 때문에 나는 미래의 독자를 위해 예제를 제공하기로 결정했습니다. 또한 모든 수업을 최종으로 표시하는 것을 잊지 마십시오.
차 등급 :
final class myPrimaryClass {
private static $instance = null;
private function __construct() {
// do something or not
return $this;
}
public static function getInstance() {
if (is_null(self::$instance) || !(self::$instance instanceof myPrimaryClass))
self::$instance = new myPrimaryClass;
return self::$instance;
}
}
싱글 서브 클래스 :
final class mySingletonSubClass {
private static $instance = null;
private function __construct(myPrimaryClass $primaryClassInstanceRef) {
return $this;
}
public static function getInstance(myPrimaryClass $primaryClassInstanceRef) {
if (is_null(self::$instance) || !(self::$instance instanceof mySingletonSubClass))
self::$instance = new mySingletonSubClass($primaryClassInstanceRef);
return self::$instance;
}
}
공장 서브 클래스 :이 예에 대한
final class myFactorySubClass {
private function __construct(myPrimaryClass $primaryClassInstanceRef) {
return $this;
}
public static function getNewInstance(myPrimaryClass $primaryClassInstanceRef) {
return new myFactorySubClass($primaryClassInstanceRef);
}
}
두 노트; 첫째, 물론 나는 그 문제를 너무 지나치게 간소화하고 있습니다. 둘째로, 당신이 사용할 수있는 깔끔한 속임수는 하위 클래스를 약간 수정하여 getInstance()
메소드가 처음부터 기본 클래스의 인스턴스를 인수로 전달하지 않아도되도록하는 것입니다. 나는 싱글 톤 클래스와 여기에 예를 제공합니다 :
final class mySingletonSubClass {
private static $instance = null;
private static $classInstanceRef = null;
private function __construct(myPrimaryClass $primaryClassInstanceRef) {
return $this;
}
public static function getInstance(myPrimaryClass $primaryClassInstanceRef = null) {
if (!is_null($primaryClassInstanceRef))
self::$classInstanceRef = $primaryClassInstanceRef;
if (is_null(self::$instance) || !(self::$instance instanceof mySingletonSubClass))
self::$instance = new mySingletonSubClass(self::$classInstanceRef);
return self::$instance;
}
}
이 있습니다,이 PHP's type-hinting mechanism에 크게 의존하고있다. 따라서 뉘앙스를 이해하려면 read the manual entry on it해야합니다 (예 : 기본 null).
언어 지원 방식이 있다고 생각하지 않으므로 트릭을 따르게됩니다. 당신이 할 수있는 일은 비밀 클래스의 생성자에 비밀 인자를 추가하는 것입니다. 이것은 당신의 주류 클래스에서만 알려져 있습니다. 그것이 없으면 NotAllowed 예외를 던집니다.
나는 그것을 (예 아무도 보안을 통해 - 무명을 좋아한다) 추악한, 매우 안전하지 알고 있지만 ... 특정 경우에 충분히 작동
나는이 주제가 조금 낡았다는 것을 알고있다.하지만 나는 자바에서 이것을 어떻게 수행 할 것인가는 Caller Stack Inspection과 같으며, PHP에도 비슷한 것이 없다고 생각한다. 그것은 PECL 모듈의하지만 사실 그것은, 수행합니다
http://www.php.net/manual/en/function.apd-callstack.php
, 당신의 코드 포인트에 대해 그것을 확인, 호출 스택을 가져가 일치하지 않는 경우 예외를 throw합니다. 이 검사를 수행하는 공통 수퍼 클래스를 작성할 수도 있습니다.
- 1. 지역에 걸쳐 원하지 않는 항목을 나열 하시겠습니까?
- 2. Word에서 원하지 않는 섹션 나누기를 제거 하시겠습니까?
- 3. PHP : 원하지 않는 줄 바꿈을 방지하는 방법
- 4. IE6에서 원하지 않는 배경색
- 5. 원하지 않는 문자
- 6. 원하지 않는 여백이 메뉴
- 7. 원하지 않는 노이즈 줄이기
- 8. 원하지 않는 sal.h 경고
- 9. XSLT 원하지 않는 값
- 10. 원하지 않는 설정 디렉토리
- 11. 원하지 않는 거리
- 12. 레이아웃에서 원하지 않는 여백
- 13. .NET Framework에서 원하지 않는 종속성
- 14. JDBC 원하지 않는 문 닫음
- 15. Apache/PHP 보안 로그인 페이지를 보호 하시겠습니까?
- 16. PHP 등록 양식을 오버플로에서 보호 하시겠습니까?
- 17. 원하지 않는 문자를 제거하는 방법
- 18. 원하지 않는 jQuery 함수를 제거하십시오.
- 19. 원하지 않는 여백 아래 이미지
- 20. ProtoInclude가 원하지 않는 종속성을 추가했습니다.
- 21. 원하지 않는 간격은 1.0 엄격한
- 22. 인증 후 원하지 않는 리디렉션
- 23. CSS - 원하지 않는 테두리 아래쪽
- 24. preg_replace이다 원하지 않는 문자로 떠나는
- 25. json_encode 원하지 않는 슬래시 추가
- 26. 원하지 않는 레코드를 추가하는 EntityRef
- 27. 원하지 않는 xml 노드 삭제
- 28. DOM 트리를 반복적으로 순환하여 원하지 않는 태그를 제거 하시겠습니까?
- 29. PHP는 원인을 포함 원하지 않는 줄 바꿈
- 30. PHP SimpleXML-> addChild - 원하지 않는 빈 네임 스페이스 속성
왜 작동하지 않습니까? –
클래스를 인스턴스화 할 수 없습니다. 당신은 그것을 보이지 않게했습니다! –
작동하지 않는 것을 설명해야합니다. 이미 작성한 코드를 게시하십시오. – Yacoby