Frage

Ich arbeite an einer PHP-Bibliothek, in der wir unsere Kunden mit verschlüsseltem Code liefern. Der Code wird ein Hauptklassen enthalten, die sie zugreifen können, Lizenzprüfung behandelt und setzen Methoden für ihre Verwendung. Die Hauptklasse werden verschiedene Unterklassen instanziiert jeweils in ihrer eigenen Datei enthalten. Wie kann ich unsere Kunden aus, einschließlich der Unterklasse Dateien und Instanziieren der Unterklassen selbst für die Verwendung zu verhindern? Gibt es eine Möglichkeit, eine Unterklasse zu verhindern, dass mit Ausnahme von unserer Klasse instanziiert werden?

War es hilfreich?

Lösung

Wilde Vermutung, aber einen Singleton für die Hauptklasse verwenden und Werk / Singleton mit Dependency Injection (der Hauptklasse) für alle Unterklassen. Auf diese Weise der Unterklassen werden nicht einmal auf eine Instanz Ihrer primären Klasse ohne gültige Referenz geladen werden.

EDIT: Da diese Antwort akzeptiert wurde Ich habe beschlossen, ein Beispiel zu schaffen, zum Wohl der zukünftigen Leser. Vergessen Sie auch nicht alle Ihre Klassen als endgültig zu markieren.

Primärklasse:

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-Subklassen:

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

Werksunterklasse:

final class myFactorySubClass {

    private function __construct(myPrimaryClass $primaryClassInstanceRef) {
        return $this;
    }

    public static function getNewInstance(myPrimaryClass $primaryClassInstanceRef) {
        return new myFactorySubClass($primaryClassInstanceRef);
    }
}

Zwei Hinweise zu diesem Beispiel; erster, natürlich bin ich zu stark zu vereinfachen grob die Angelegenheit. Zweitens, ein netter Trick, die Sie einsetzen können, ist die Unterklassen etwas zu ändern, so dass die getInstance() Methoden nicht immer brauchen eine Instanz der Klasse der Grundschule als Argument nach dem ersten Mal bestanden haben. Ich werde hier ein Beispiel mit der Singleton-Klasse bieten:

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

Bitte beachten Sie, stützt sich diese stark auf PHP-Typ-Hinting Mechanismus . Als solche sollten Sie lesen Sie es so Sie verstehen die Nuancen (zB Standard null).

Andere Tipps

Ich glaube nicht, dass es eine Sprachgestützte Art und Weise, so soll es sein bis zu Tricks. Was Sie tun können, ist ein Geheimnis Argument zu Ihrer privaten Klasse Konstruktoren, die nur durch Ihre Hauptklasse bekannt ist. Wenn das nicht vorhanden ist, eine notAllowed Ausnahme aus.

Ich weiß, es ist hässlich, und nicht sehr sicher (ja niemand mag sicherheits durch Dunkel), aber es könnte genug für Ihren speziellen Fall arbeiten ...

Ich weiß, dass dieses Thema jetzt ein wenig alt, aber ich dachte nur, dass, wie ich das in Java tun würde, ist mit Anrufer-Stack Inspection und PHP nicht über etwas ähnliches? In der Tat hat es, obwohl es eine PECL-Modul ist:

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

Holen Sie sich das Call-Stack, überprüfen Sie es gegen den Code Punkte, eine Ausnahme aus, wenn es nicht übereinstimmt. Man könnte sogar eine gemeinsame übergeordnete Klasse erstellen, die diese Prüfung für Sie.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top