PHP のインターフェースは最初から最後まで論争の的でした。このインターフェースは非常に優れているという人もいれば、役に立たないという人もいます。まず、美味しいか不味いかを判断する基準を理解する必要があります。間違いなく、これは Java/C++ と比較されます。上記の例と議論では、PHP のインターフェイスは「契約指向プログラミング」において不十分であり、本来の役割を果たしていません。
実際には、マシンクラスの宣言はプレーンクラスの前にある必要があります。インターフェイスはシステムによって提供される一連の仕様を提供し、次にマシン クラスがインターフェイス用の一連の API を提供して実装し、最後にカスタム クラスを提供します。 Java では、インターフェイス (マルチスレッド実行可能インターフェイス、コンテナ コレクション インターフェイスなど) が人気がある理由は、システムが作業の最初の 2 つの部分を実行し、プログラマは特定の実装クラスを作成するだけで確実に実行できるためです。インターフェースは利用可能であり、制御可能です。
なぜインターフェースを使用するのですか?インターフェースの利点は何ですか?インターフェイス自体は実装を提供せず、仕様のみを提供します。クラスがインターフェイスを実装していることがわかっていれば、そのインターフェイスで呼び出すことができるメソッドを知る必要があるだけです。
PHP では、インターフェイスのセマンティクスは限られており、インターフェイスを使用する場所は多くありません。PHP のインターフェイスは、チームの基本契約の役割を果たします。コードは次のとおりです。
<?php interface Cache { /** * describe:缓存管理,项目经理定义接口,技术人员负责实现 */ const maxKey = 10000; //最大换存量 public function getCache($key); //获取缓存 public function setCache($key,$value); //设置缓存 public function flush(); //清空缓存 }
PHP は型付けが弱く、柔軟性を重視しているため、インターフェイスを大規模に使用することはお勧めできませんが、一部の「カーネル」コードでのみインターフェイスを使用することをお勧めします。PHP のインターフェイスは、セマンティクスの多くを失っているためです。インターフェイスには必要があります。セマンティックの観点からは、
抽象クラスをさらに使用できます。抽象クラスとインターフェイスの比較については、詳細は説明しません。
オブジェクト指向 の特別な機能に多くの機能拡張を加えており、その中には SPL (ラベル付き PHP ライブラリ) への試みがあり、その中で最も重要なものはイテレータ インターフェースです。このインターフェースを実装することでオブジェクトを foreach 構造内で利用できるようになり、利用形態が比較的統一されます。たとえば、SPL には DirectoryIterator クラスがあり、このクラスは SplFileInfo クラスを統合し、Iterator、Traversable、SeekableIterator の 3 つのインターフェイスを実装します。このクラスのインスタンスは、親クラス SplFileInfo のすべての関数を取得できます。インターフェース によって表示される操作も実装します。 Iterator インターフェースのプロトタイプは次のとおりです:
* 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().
クラスが Iterator の実装を宣言する場合、これらの 5 つのメソッドを実装する必要があります。これらの 5 つのメソッドが実装されていれば、このクラスのインスタンスを簡単に反復できます。ここで、DirectoryIterator クラスが利用できる理由は、既にシステム側で Iterator インターフェースが実装されているため、以下のように利用できます。
<?php $dir = new DirectoryIterator(dirname(FILE)); foreach ($dir as $fileInfo) { if(!$fileInfo->isDir()) { echo $fileInfo->getFilename(),"\t",$fileInfo->getSize(),PHP_EOL; } }
DirectoryIterator クラスを利用せずに、自分で実装すれば、コード量が増えるだけでなく、ループ時のスタイルも統一されません。作成したクラスが Iterator インターフェイスも実装している場合は、Iterator のように動作できます。
Iterator を実装している限り、クラスのオブジェクトを foreach オブジェクトとして使用できるのはなぜですか?実際、その理由は非常に簡単です。PHP インスタンス オブジェクトで foreach 構文を使用すると、インスタンスが Iterator インターフェイスを実装しているかどうかがチェックされ、実装されている場合、foreach ステートメントは組み込みメソッドまたはメソッドを使用してシミュレートされます。 toString メソッドの実装は前と同じですか?実際、toString メソッドはインターフェイスの偽装実装です。インターフェイスは次のようになります。インターフェイス自体は何もしません。システムはインターフェイスの動作を内部的に実装します。そのため、このインターフェイスを実装する限り、インターフェイスが提供するメソッドを使用できます。これはインターフェイスの「プラグ アンド プレイ」のアイデアです
インターフェイスが複数の統合を偽装した実装であることは誰もが知っています。継承について話したときに、ミックスインの実装に使用されるトレイトについて言及しました。実際、トレイトは考えることができます。強化されたインターフェースとして。
次のコードを見てください:
<?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();
上記のコードの結果は次のとおりです:
Hello Word!
MyHelloWorld ここでは 2 つのトレイトを同時に実装しているため、2 つのトレイトのコード セグメントをそれぞれ呼び出すことができます。コードからわかるように、トレイトはインターフェイスと非常に似ています。違いは、トレイトがコードを含むインターフェイスをインポートできることです。ある意味、トレイトとインターフェイスは「複数の統合」を偽装した実装です。
インターフェイスに関するいくつかの概念を要約します:
インターフェイスは実際には非常にシンプルですが、インターフェイスのさまざまなアプリケーションは非常に柔軟です。デザイン パターンの大部分もインターフェイスを中心に展開されます。
以上がPHP インターフェースの使用に関するいくつかの要約の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。