2009-11-03 2 views
1

Я работаю над библиотекой PHP, в которой мы будем предоставлять нашим клиентам зашифрованный код. Код будет включать основные классы, которые они могут создать, которые будут обрабатывать проверку лицензии и выставлять методы для их использования. Основной класс будет создавать несколько подклассов, каждый из которых содержится в их собственном файле. Как я могу запретить нашим клиентам включать файлы подкласса и создавать экземпляры самих подклассов для использования? Есть ли способ предотвратить создание вспомогательного класса, кроме нашего основного класса?Защита классов PHP от нежелательного экземпляра?

+0

Почему это не работает? –

+2

Я, конечно, не могу создать экземпляр вашего класса. Вы сделали его невидимым! –

+0

Вам нужно объяснить, что не работает. Отправьте код, который вы уже написали. – Yacoby

ответ

7

Wild догадки, но использовать Singleton для основного класса и фабрики/Singleton с инъекцией зависимостей (основного класса) для всех подклассов. Таким образом, подклассы даже не загружаются без действительной ссылки на экземпляр вашего основного класса.

EDIT: Поскольку этот ответ был принят, я решил привести пример для будущих читателей. Кроме того, не забудьте отметить все ваши классы как окончательные.

Primary Класс:

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; 
    } 
} 

Singleton Подкласс:

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

Я знаю, что эта тема немного устарела, но я просто думал, что, как бы это сделать на Java, с проверкой стека вызовов вызывающего абонента, и нет ли у PHP чего-то подобного? На самом деле это делает, хотя это модуль PECL:

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

Получить стек вызовов, проверить его против ваших точек коды, бросить исключение, если он не соответствует. Вы даже можете создать общий суперкласс, который проверяет вас.

Смежные вопросы