Wenn ich eine Schnittstelle in PHP und eine Factory-Klasse definiere, die eine Instanz dieser Schnittstelle erstellt, gibt es irgendeine Möglichkeit, dass ich Client-Code zwingen kann, nur die Schnittstelle und nicht die zugrunde liegende konkrete Klasse zu verwenden? Aus meiner Sicht sind die Clients in der Lage, auch alle öffentlichen Funktionen / Felder in der zugrunde liegenden Klasse zu verwenden.
Hier ist ein Beispiel:
%Vor%Was Sie fragen, ist nur mit einer statisch typisierten Sprache möglich, und da PHP dynamisch typisiert ist, ist die kurze Antwort, dass es nicht möglich ist.
Beispielsweise könnte in% createMyInterface
in% IMyInterface
zurückgeben, und die einzigen möglichen Operationen für dieses Objekt sind diejenigen, die in der Schnittstelle selbst definiert sind. Natürlich ist das Objekt wirklich vom Typ ConcreteImplOfMyInterface
, so dass Sie es immer auf diesen Typ umwandeln können, um auf die anderen Felder / Methoden zuzugreifen.
PHP hat keine deklarierten Typen. Was Sie also von einer Funktion zurückgeben, ist einfach eine "Variable" - sie hat keinen Typ. Und weil es keine Typen gibt, sind alle Feld / Methoden-Lookups dynamisch, so dass immer auf alles, was "da" im Objekt ist, zugegriffen werden kann.
In gewisser Weise sind Schnittstellen in einer Sprache wie PHP etwas eingeschränkt - jede Klasse, die eine Schnittstelle implementiert, muss alle ihre Methoden implementieren, aber da gibt es keine Garantie, was eine Funktion in der ersten zurückgeben kann Ort, gibt es im Grunde keine Garantie für irgendetwas überhaupt. Das Beste, was Sie tun können, ist instanceof
zu verwenden, um zu überprüfen, ob eine unbekannte Variable eine bestimmte Schnittstelle implementiert.
Aus diesem Grund sind Schnittstellen in PHP gut:
%Vor%Es erfordert, dass jede Variable, die in diese Funktion eintritt, eine Instanz von Printable ist. Sie zwingen also jeden, der Ihren Code verwendet, diese Schnittstelle zu implementieren, wenn Sie diese Funktion verwenden möchten.
PHP 5.1 Ссылка
Wenn Sie sicherstellen möchten, dass ein anderer Benutzer bestimmte Methoden oder Variablen einer Klasse nicht verwenden kann, müssen Sie diese Methoden und Variablen als private
definieren. Dadurch können sie nur von dieser bestimmten Klasse verwendet werden. (Nicht einmal Klassen, die deine Klasse erweitern, können sie benutzen)
Da PHP eine dynamische Sprache ist, bedeutet dies, dass alle Zugriffe auf Klassenmitglieder usw. zur Laufzeit aufgelöst werden. Das heißt, wenn ich Code habe, der $ foo- & gt; bar () aufruft und ich ein Objekt in $ foo mit der Methode bar () erhalten habe, würde es aufgerufen werden, selbst wenn es nicht die Methode bar () wäre, die ich beabsichtigte rufe aber eine andere Methode auf ein anderes Objekt an, das zufällig den gleichen Namen hat.
Allerdings können Sie einen gewissen Schutz bieten, indem Sie typisierte Parameter verwenden, damit die Funktion nur bestimmte Objekte akzeptiert:
%Vor%Sie können jedoch immer noch niemanden daran hindern, IMyInterface zu implementieren und dann Funktionen zu schreiben, die IMyInterface akzeptieren, aber als Objekt einer höheren Klasse verwenden. Wie ich schon sagte, liegt das daran, dass PHP eine dynamische Sprache ist.