Ist es in PHP 5 möglich, eine Schnittstelle mit privaten / geschützten Methoden zu haben?
Gerade habe ich:
interface iService
{
private method1();
}
Das wirft einen Fehler:
Analysefehler: Syntaxfehler, unerwarteter T_STRING, Erwartung von T_VARIABLE
Ich möchte nur die Bestätigung haben, dass eine Schnittstelle nur öffentliche Methoden enthalten kann.
private function method1 ();
nicht der Fallprivate method1();
.Antworten:
In der PHP-Handbuchseite zu Schnittstellen heißt es ausdrücklich:
Ich denke, das erklärt den Fehler, den du bekommst ;-)
quelle
Schnittstellen werden verwendet, um öffentliche Methoden einer Klasse zu beschreiben, die diese Schnittstelle implementiert. Sie können niemals eine private Methode in einer Schnittstelle haben. Es wird davon ausgegangen, dass alle Methoden in einer Schnittstelle verwendet werden, und sie sollten nicht geändert werden.
Interfaces ist die PHP-Verbindung, dies ist jedoch Standard in der OO-Programmierung.
quelle
Im Allgemeinen kann eine Schnittstelle nur öffentliche Mitglieder haben, da die einzige Funktion einer Schnittstelle darin besteht, geerbt zu werden.
Aus dem PHPfreaks.com-Tutorial:
quelle
Schnittstellen sind Typdeklarationen. Ein Typ besteht aus einer Reihe von Werten sowie einer Reihe von Operationen, die von außen ausgeführt werden können. Eine private Methode passt nicht in dieses Bild.
interface T { public /*int*/ function f(array $a); } interface U { public /*T*/ function g(T $t); } class C implements U { public function g(T $t) { ... $x = $t->f(); ... } }
Schnittstellen sind nützlich, weil sie die Schnittstellen von Objekten angeben. wie die Objekte mit ihrer Umgebung kommunizieren.
Nehmen wir jetzt an, wir
T::f
könnten als privat deklariert werden. Wie wäre das für andere Objekte nützlich? es wäre nicht von außen aufrufbar, es wäre nicht Teil seiner Schnittstelle.quelle
In vielen Fällen hilft eine Schnittstellendefinition anderen Modulen, das Verhalten und die API einer Klasse zu gewährleisten. In diesen Fällen können die anderen Module nicht auf private Methoden zugreifen oder diese verstehen. Deshalb können Sie niemals private Methoden auf eine Schnittstelle setzen.
quelle
Big NO , jede Methode in der Schnittstelle hat niemals eine private oder geschützte Zugriffskennung.
** Alle in einer Schnittstelle deklarierten Methoden müssen öffentlich sein. Dies ist die Natur einer Schnittstelle.
Einige andere interessante Fakten zur Benutzeroberfläche
Schnittstellen können wie Klassen mit dem Operator "Erweitern" erweitert werden. Sie können nur andere Schnittstellen erweitern. (Quelle: https://www.php.net/manual/en/language.oop5.interfaces.php )
Beachten Sie, dass es möglich ist, einen Konstruktor in einer Schnittstelle zu deklarieren, was in einigen Kontexten nützlich sein kann, z. B. für die Verwendung durch Fabriken. Die Unterschrift sollte in der Kinderklasse gleich sein.
In Ihrem Fall besteht noch ein weiteres Problem darin, dass das Funktionsschlüsselwort in der Funktionsdeklaration fehlt. Es sollte sein
interface iService { public function method1(); }
quelle
Wie bereits erwähnt, können Schnittstellen nur die öffentlich sichtbaren Methoden definieren. Ich wollte ein Beispiel zeigen, wie geschützte Methoden gehandhabt werden können. Um die Verwendung bestimmter geschützter Methoden zu erzwingen, kann eine abstrakte Klasse erstellt werden, die die Schnittstelle implementiert.
Dies ist insbesondere dann sinnvoll, wenn die abstrakte Klasse bereits einen Teil der Arbeitslast bewältigen kann, um die eigentliche Implementierung zu vereinfachen. Hier kümmert sich beispielsweise eine abstrakte Klasse um die Instanziierung des Ergebnisobjekts, das immer benötigt wird:
Zunächst die Schnittstelle.
interface iService { /** * The method expects an instance of ServiceResult to be returned. * @return ServiceResult */ public function doSomething(); }
Die abstrakte Klasse definiert dann die interne Methodenstruktur:
abstract class AbstractService implements iService { public function doSomething() { // prepare the result instance, so extending classes // do not have to do it manually themselves. $result = new ServiceResult(); $this->process($result); return $result; } /** * Force all classes that extend this to implement * this method. * * @param ServiceResult $result */ abstract protected function process($result); }
Die Klasse, die die eigentliche Implementierung ausführt, erbt die Schnittstelle automatisch von der abstact-Klasse und muss nur die geschützte Methode implementieren.
class ExampleService extends AbstractService { protected function process($result) { $result->setSuccess('All done'); } }
Auf diese Weise erfüllt die Schnittstelle den öffentlichen Auftrag, und durch die
AbstractService
Klasse wird der interne Auftrag erfüllt. Die Anwendung muss nur die Verwendung derAbstractService
Klasse erzwingen, wo dies zutreffend ist.quelle