2009-11-03 3 views
1

저는 고객에게 암호화 된 코드를 제공 할 PHP 라이브러리를 개발 중입니다. 코드에는 라이센스 검증을 처리하고 메소드 사용 방법을 공개 할 수있는 인스턴스화 할 수있는 기본 클래스가 포함됩니다. 메인 클래스는 각각 자신의 파일에 포함 된 여러 하위 클래스를 인스턴스화합니다. 우리 고객이 하위 클래스 파일을 포함하지 않고 하위 클래스 자체를 인스턴스화하지 못하게하려면 어떻게해야합니까? 메인 클래스를 제외하고 하위 클래스가 인스턴스화되지 않도록하는 방법이 있습니까?원하지 않는 인스턴스 생성에서 PHP 클래스를 보호 하시겠습니까?

+0

왜 작동하지 않습니까? –

+2

클래스를 인스턴스화 할 수 없습니다. 당신은 그것을 보이지 않게했습니다! –

+0

작동하지 않는 것을 설명해야합니다. 이미 작성한 코드를 게시하십시오. – Yacoby

답변

7

추측 만의 싱글을 사용할 수 있습니다 메인 클래스, 모든 서브 클래스에 대한 의존성 주입 (메인 클래스의 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).

1

언어 지원 방식이 있다고 생각하지 않으므로 트릭을 따르게됩니다. 당신이 할 수있는 일은 비밀 클래스의 생성자에 비밀 인자를 추가하는 것입니다. 이것은 당신의 주류 클래스에서만 알려져 있습니다. 그것이 없으면 NotAllowed 예외를 던집니다.

나는 그것을 (예 아무도 보안을 통해 - 무명을 좋아한다) 추악한, 매우 안전하지 알고 있지만 ... 특정 경우에 충분히 작동

0

나는이 주제가 조금 낡았다는 것을 알고있다.하지만 나는 자바에서 이것을 어떻게 수행 할 것인가는 Caller Stack Inspection과 같으며, PHP에도 비슷한 것이 없다고 생각한다. 그것은 PECL 모듈의하지만 사실 그것은, 수행합니다

http://www.php.net/manual/en/function.apd-callstack.php

, 당신의 코드 포인트에 대해 그것을 확인, 호출 스택을 가져가 일치하지 않는 경우 예외를 throw합니다. 이 검사를 수행하는 공통 수퍼 클래스를 작성할 수도 있습니다.

관련 문제