Die Schnittstelle von PHP war von Anfang bis Ende umstritten. Einige Leute sagen, dass die Schnittstelle sehr gut ist, während andere sagen, dass die Schnittstelle nutzlos ist. Zunächst müssen Sie verstehen, nach welchen Kriterien beurteilt wird, ob etwas gut oder schlecht schmeckt. Zweifellos wird dies mit Java/C++ verglichen. Im obigen Beispiel und in der Diskussion reicht die PHP-Schnittstelle für die „vertragsorientierte Programmierung“ nicht aus und spielt nicht die ihr gebührende Rolle.
Tatsächlich sollte die Deklaration der Maschinenklasse vor der einfachen Klasse stehen. Die Schnittstelle stellt eine Reihe von Spezifikationen bereit, die vom System bereitgestellt werden, dann stellt die Maschinenklasse eine Reihe von APIs für die Schnittstelle bereit und implementiert diese und schließlich die benutzerdefinierte Klasse. Der Grund für die Beliebtheit von Schnittstellen in Java (ausführbare Multithread-Schnittstelle, Container-Collection-Schnittstelle usw.) liegt darin, dass das System die ersten beiden Teile der Arbeit für uns erledigt und Programmierer nur bestimmte Implementierungsklassen schreiben müssen, um dies sicherzustellen Die Schnittstelle ist verfügbar und steuerbar.
Warum Schnittstellen verwenden? Welche Vorteile bieten Schnittstellen? Die Schnittstelle selbst stellt keine Implementierung, sondern lediglich eine Spezifikation bereit. Wenn wir wissen, dass eine Klasse eine Schnittstelle implementiert, dann kennen wir die Methoden, die auf der Schnittstelle aufgerufen werden können. Wir müssen nur diese kennen.
In PHP ist die Semantik von Schnittstellen begrenzt und es gibt nicht viele Orte, an denen Schnittstellen in PHP verwendet werden können, die als Basisvertrag für das Team dienen folgt:
<?php interface Cache { /** * describe:缓存管理,项目经理定义接口,技术人员负责实现 */ const maxKey = 10000; //最大换存量 public function getCache($key); //获取缓存 public function setCache($key,$value); //设置缓存 public function flush(); //清空缓存 }
Da PHP schwach typisiert ist und Wert auf Flexibilität legt, wird die Verwendung von Schnittstellen in großem Umfang nicht empfohlen. Stattdessen wird es aufgrund der Schnittstellen nur in einigen „Kernel“-Codes verwendet In PHP sollten viele Schnittstellen ihre Semantik verloren haben. Aus semantischer Sicht können Sie abstrakte Klasse häufiger verwenden. Was den Vergleich zwischen abstrakten Klassen und Schnittstellen betrifft, werde ich nicht näher darauf eingehen.
Darüber hinaus hat PHP5 viele Verbesserungen an den objektorientierten-Funktionen vorgenommen. Darunter ist der Versuch, einige Schnittstellen in SPL zu implementieren Davon ist die Iterator-Iterator-Schnittstelle. Durch die Implementierung dieser Schnittstelle kann das Objekt in der foreach-Struktur verwendet werden, sodass die Verwendungsform relativ einheitlich ist. Beispielsweise gibt es in SPL eine DirectoryIterator-Klasse. Diese Klasse integriert die Klasse SplFileInfo und implementiert die drei Schnittstellen Iterator, Traversable und SeekableIterator SplFileInfo und auch in der Lage, die von der Iterator-Schnittstelle angezeigten Operationen zu implementieren.
Der Prototyp der Iterator-Schnittstelle lautet wie folgt:
* current() This methodreturns the current index's value. You are solely responsible for tracking what thecurrent index is as the interface does not do this for you. *key() This method returns the value of the current index's key. For foreach loops this is extremely important so that the key value can be populated. *next() This method moves the internal index forward one entry. *rewind() This method should reset the internal index to the first element. *valid() This method should return true or false if there is a current element. It is called after rewind() or next().
Wenn eine Klasse die Implementierung von Iterator angibt, muss sie diese fünf Methoden implementieren. Wenn diese fünf Methoden implementiert sind, kann sie dies tun lässt sich leicht über Instanzen dieser Klasse iterieren. Der Grund, warum die DirectoryIterator-Klasse hier verwendet werden kann, liegt darin, dass das System die Iterator-Schnittstelle bereits implementiert hat, sodass sie wie folgt verwendet werden kann:
<?php $dir = new DirectoryIterator(dirname(FILE)); foreach ($dir as $fileInfo) { if(!$fileInfo->isDir()) { echo $fileInfo->getFilename(),"\t",$fileInfo->getSize(),PHP_EOL; } }
Es ist denkbar, dass Sie den DirectoryIterator nicht verwenden Klasse, aber implementieren Sie es selbst. Nicht nur die Menge an Code hat zugenommen, auch der Stil der Schleife ist nicht mehr einheitlich. Wenn die von Ihnen geschriebene Klasse auch die Iterator-Schnittstelle implementiert, kann sie wie ein Iterator funktionieren.
Warum kann das Objekt einer Klasse als foreach-Objekt verwendet werden, solange es den Iterator implementiert? Tatsächlich ist der Grund sehr einfach. Wenn Sie die foreach-Syntax für ein PHP-Instanzobjekt verwenden, wird überprüft, ob die Instanz die Iterator-Schnittstelle implementiert. Wenn dies der Fall ist, wird die foreach-Anweisung durch integrierte Methoden oder mithilfe von Methoden im simuliert Ist die Implementierungsklasse dieselbe wie zuvor? Tatsächlich ist die toString-Methode eine getarnte Implementierung der Schnittstelle. Die Schnittstelle selbst führt nichts aus. Das System implementiert das Verhalten der Schnittstelle intern. Solange Sie diese Schnittstelle implementieren, können Sie die von der Schnittstelle bereitgestellten Methoden verwenden. Dies ist die „Plug-and-Play“-Idee von Schnittstellen
Wir alle wissen, dass Schnittstellen eine verschleierte Implementierung mehrerer Integrationen sind, und wenn wir über Vererbung sprechen, haben wir tatsächlich die Merkmale erwähnt, die zur Implementierung von Mixins verwendet werden , Traits können als erweiterte Version der Schnittstelle betrachtet werden.
Sehen Sie sich den folgenden Code an:
<?php trait Hello { public function sayHello() { echo 'Hello '; } } trait World { public function sayWorld() { echo 'Word'; } } class MyHelloWorld { use Hello, World; public function sayExclamationMark() { echo '!'; } } $o = new MyHelloWorld(); $o->sayHello(); $o->sayWorld(); $o->sayExclamationMark();
Die Ergebnisse des obigen Codes sind wie folgt:
Hello Word!
MyHelloWorld implementiert hier zwei Merkmale gleichzeitig: so dass die Codesegmente in den beiden Merkmalen jeweils aufgerufen werden können. Wie Sie dem Code entnehmen können, sind Traits Schnittstellen sehr ähnlich. Der Unterschied besteht darin, dass Traits Schnittstellen importieren können, die Code enthalten. In gewissem Sinne sind Traits und Interfaces eine verschleierte Implementierung der „multiplen Integration“.
Fassen Sie einige Konzepte zu Schnittstellen zusammen:
Schnittstellen existieren als Spezifikation und Vertrag. Als Spezifikation sollte die Schnittstelle die Benutzerfreundlichkeit gewährleisten; als Vertragsschnittstelle sollte sie die Steuerbarkeit gewährleisten,
Die Schnittstelle ist nur eine Anweisung, und sobald das Schlüsselwort „interface“ verwendet wird, sollte dies der Fall sein umgesetzt. Es kann vom Programmierer (externe Schnittstelle) oder vom System (interne Schnittstelle) implementiert werden. Die Schnittstelle selbst macht nichts, kann uns aber sagen, was sie kann.
Es gibt zwei Mängel bei den Schnittstellen in PHP. Zum einen gibt es keine Vertragsbeschränkungen, zum anderen gibt es nicht genügend interne Schnittstellen.
Die Schnittstelle ist eigentlich sehr einfach, aber die verschiedenen Anwendungen der Schnittstelle sind sehr flexibel. Ein großer Teil des Designmusters dreht sich auch um die Schnittstelle.
Das obige ist der detaillierte Inhalt vonEinige Zusammenfassungen zur Verwendung von PHP-Schnittstellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!