我正在研究一個PHP庫,我們將在其中爲我們的客戶提供加密代碼。該代碼將包含一個主要類,他們可以實例化該類,以處理許可證驗證並公開使用方法。主類將實例化每個包含在其自己文件中的幾個子類。如何防止我們的客戶端包含子類文件並實例化子類本身以供使用?有沒有辦法阻止一個子類被實例化,除了我們的主類?保護PHP類免受不希望的實例化?
1
A
回答
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
獲取調用堆棧,檢查它,你的代碼點,拋出一個異常,如果它不匹配。你甚至可以創建一個通用的超類來檢查你。
相關問題
- 1. 無法訪問實例化類的受保護方法
- 2. 保護COM接口免受例外
- 3. 如何保護類直接實例化
- 4. 保護PHP免受MySQL注入
- 5. 如何保護PHP免受揹負?
- 6. 保護window.opener免受更改
- 7. Hippomocks希望通過類實例調用
- 8. 如何保護java.lang.Object的受保護方法免受子類攻擊?
- 9. 暴露受保護的Objective-C的實例變量的子類
- 10. 需要運行一個受保護的方法時,我的類實例化
- 11. 類不保留受保護的值
- 12. 強制子類定義受保護的最終實例變量
- 13. 使用反射來創建受保護類的實例
- 14. 來自不同實例的Java受保護的方法訪問
- 15. 受保護的內部和受保護的行爲類似
- 16. 免費訪問受保護的成員
- 17. 保護免受惡意的sql注入
- 18. 受保護的派生類
- 19. .NET中受保護的類
- 20. 受保護的成員在其自己的類實例中不可訪問?
- 21. 在不受保護和受保護的工作表中實現代碼VBA Excel
- 22. 實現文件中的實例變量 - 私有與受保護
- 23. 訪問擴展抽象基類的類的實例的受保護變量?
- 24. PHP類的鏈實例化
- 25. 實例化繼承與保護訪問符的內部類
- 26. 實例化類方法而不實例化PHP中的類不再可能?
- 27. 保護文件免受系統修改
- 28. 如何保護網站免受攻擊
- 29. 如何保護自己免受argumentOutOfRangeException
- 30. 如何保護WebRTC免受MitM攻擊?
爲什麼不工作? – 2009-11-03 23:03:41
我當然不能實例化你的類。你已經讓它看不見了! – 2009-11-03 23:07:43
你需要解釋什麼是不工作的。發佈您已經編寫的代碼。 – Yacoby 2009-11-03 23:07:55