P粉7029469212023-09-03 20:17:24
インターフェイスによって「クラスの動作が変わる」と言っているのではなく、インターフェイスによって クラスの機能の拡張が簡単になるということです。
インターフェイスをオブジェクト指向プログラミングの概念として理解するには、まずインターフェイスが解決したい問題を理解する必要があります。「インターフェイス」はどのような問題を解決するために設計されていますか?
コントラクトです。これは、duck-typing が PHP で実装される方法です。機能を他の人に公開したいライブラリ作成者の観点から考える必要があります。例えば、### リーリー
$person には getName()
メソッドが必要であることをライブラリ ユーザーに確実に知らせるために、 # を持つクラス person
> を作成できます。 ##getName() メソッド。
型宣言は、コードが解決されるときに潜在的なエラーを検出するために使用されます。
リーリー
食べ物を物に与える別のライブラリがあるとします。
リーリー
###このことを考慮...###
Pet
クラスを作成したいとします。ユーザーは、単に
Greeter
ライブラリと
ライブラリの両方を使用する Pet を作成するにはどうすればよいですか?
おそらくこれは事実ですか?
リーリー
残念ながら、PHP は多重継承
1 つのクラスのみを拡張できます。上記のコードは無効です。したがって、現在の状況では、ユーザーはいずれかのライブラリしか使用できません。
さらに、「名前」は、さまざまなものによって非常に異なる概念になる可能性があります (たとえば、getName() を使用して $first_name と
$last_name# を返す場合があります
getName() メソッドの適切なデフォルト実装が存在しない可能性があります。
したがって、ライブラリ作成者は、自分のライブラリがユーザーにとって可能な限り柔軟であることを望んでいます。何ができるの?
PHP の「インターフェイス」を使用してこの問題を解決するにはどうすればよいですか? 代码>
インターフェイスはメソッドのシグネチャの宣言です。これは、具体的なクラス/継承要件を使用せずにライブラリ要件を宣言する簡単な方法です。
リーリー
フィーダー
ライブラリ 特定のクラス (または親クラスの継承) は必要なく、クラスは複数のインターフェイスを実装できます。したがって、次の
Petこの
PetGreeter ライブラリおよび
Feeder
ArrayAccess
インターフェイスについてはどうですか?
ArrayAccess
前に述べたインターフェイスと似ていますが、PHP はそれを実装するクラスに機能を提供します。ただし、上記の
GreeterFeeder の例を提供する代わりに、コア PHP は ArrayAccess を実装するクラスに syntax Sugar
を提供します。これは、AccessAccess インターフェイスを実装するクラスを操作するときに、より単純なコードを使用できることを意味します。
公式の例では、
リーリー
これらを実装する場合は、次のように置き換えてください: リーリー
配列のような構文で $obj
を使用すると、コードを短くできます。