2009-11-03 74 views
1

我正在研究一個PHP庫,我們將在其中爲我們的客戶提供加密代碼。該代碼將包含一個主要類,他們可以實例化該類,以處理許可證驗證並公開使用方法。主類將實例化每個包含在其自己文件中的幾個子類。如何防止我們的客戶端包含子類文件並實例化子類本身以供使用?有沒有辦法阻止一個子類被實例化,除了我們的主類?保護PHP類免受不希望的實例化?

+0

爲什麼不工作? – 2009-11-03 23:03:41

+2

我當然不能實例化你的類。你已經讓它看不見了! – 2009-11-03 23:07:43

+0

你需要解釋什麼是不工作的。發佈您已經編寫的代碼。 – Yacoby 2009-11-03 23:07:55

回答

7

胡亂猜測,但使用一個單身的主類和工廠/ 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()方法並不總是需要在第一次之後將主類的實例作爲參數傳遞。我會在這裏提供一個例子的singleton類:

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,以便了解細微差別(例如,默認爲空)。

1

我不認爲有一種語言支持的方式,所以這將是技巧。 你可以做的是給你的私有類的構造函數添加一個祕密的參數,這個參數只被你的主類知道。如果不存在,則拋出NotAllowed異常。

我知道它的醜陋,不是很安全(是沒有人喜歡安全通默默無聞),但它可能工作足以讓您的具體情況......

0

我知道這個話題現在已經有點老了,但我只是在想,如何在Java中這樣做是因爲調用者堆棧檢查,而不是PHP有類似的東西?事實上確實如此,雖然它是一個PECL模塊:

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

獲取調用堆棧,檢查它,你的代碼點,拋出一個異常,如果它不匹配。你甚至可以創建一個通用的超類來檢查你。