複数 - php interface 引数




PHPのインターフェイスのポイントは何ですか? (10)

Interfaces使用すると、それを実装するクラスのメソッドを定義するコードを作成できます。 ただし、これらのメソッドにコードを追加することはできません。

抽象クラスを使用すると、メソッドにコードを追加しながら、同じことを行うことができます。

抽象クラスで同じ目標を達成できる場合、なぜインターフェイスの概念が必要なのでしょうか?

私はそれがC ++からJavaへのオブジェクト指向理論に関係していると言われました。これはPHPのオブジェクト指向の基礎です。 この概念はJavaでは便利ですが、PHPでは役に立ちませんか? プレースホルダーが抽象クラスに散らばらないようにするための単なる方法ですか? 何か不足していますか?


この点でPHPが異なるかどうかは思い出せませんが、Javaでは複数のインターフェイスを実装できますが、複数の抽象クラスを継承することはできません。 PHPも同じように機能すると思います。

PHPでは、コンマで区切ることにより複数のインターフェースを適用できます(きれいな表現が見つからないと思います)。

複数の抽象クラスについては、複数の抽象クラスを相互に拡張することができます(繰り返しますが、それについては完全にはわかりませんが、どこかで見たことがあると思います)。 拡張できないのは、最終クラスだけです。


PHPでインターフェイスを使用します。

  1. 実装を隠す-オブジェクトのクラスへのアクセスプロトコルを確立し、そのオブジェクトを使用したすべての場所でリファクタリングせずに、基礎となる実装を変更します
  2. 型を確認するには-パラメータに特定の型があることを確認するなど、 $object instanceof MyInterface
  3. 実行時にパラメーターチェックを強制するには
  4. 複数の動作を単一のクラスに実装するには(複雑な型を構築する)

    クラスCarはEngineInterface、BodyInterface、SteeringInterfaceを実装します{

Carオブジェクトがstart()stop() (EngineInterface)またはgoRight()goLeft() (ステアリングインターフェイス)になります

そして今私が考えることができない他のこと

番号4は、おそらく抽象クラスでは対処できない最も明白なユースケースです。

Javaで考えることから:

インターフェイスは、「これは、この特定のインターフェイスを実装するすべてのクラスがどのように見えるかです」と言います。したがって、特定のインターフェイスを使用するコードは、そのインターフェイスに対して呼び出すことができるメソッドを知っています。 そのため、インターフェイスはクラス間の「プロトコル」を確立するために使用されます。


抽象クラスがすでに存在する場合、なぜインターフェイスが必要なのでしょうか? 多重継承を防ぐため(複数の既知の問題を引き起こす可能性がある)

そのような問題の1つ:

「ダイアモンド問題」(「致命的なダイアモンド」とも呼ばれる)は、2つのクラスBとCがAから継承し、クラスDがBとCの両方から継承する場合に発生するあいまいさです。 BとCがオーバーライドされ、Dはそれをオーバーライドしません。その後、Dが継承するメソッドのバージョンは、Bのバージョンですか、Cのバージョンですか。

ソース: https://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem : https://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem

インターフェースを使用する理由/タイミング 例...世界中のすべての車には同じインターフェース(メソッド)があります... AccelerationPedalIsOnTheRight()BrakePedalISOnTheLeft() 。 各自動車ブランドには、これらの「方法」が他のブランドとは異なると想像してください。 BMWの右側にはブレーキがあり、ホンダの左側にはブレーキがあります。 人々は、異なるブランドの車を購入するたびに、これらの「方法」がどのように機能するかを学ぶ必要があります。 そのため、複数の「場所」で同じインターフェースを使用することをお勧めします。

インターフェースはあなたにとって何をしますか(なぜ誰かがそれを使うのでしょうか)? インターフェースは、あなたが「間違い」をすることを防ぎます(特定のインターフェースを実装するすべてのクラスが、インターフェースにあるメソッドをすべて持っていることを保証します)。

// Methods inside this interface must be implemented in all classes which implement this interface.
interface IPersonService
{   
    public function Create($personObject);
}

class MySqlPerson implements IPersonService
{
    public function Create($personObject)
    {
        // Create a new person in MySql database.
    }
}

class MongoPerson implements IPersonService
{
    public function Create($personObject)
    {
        // Mongo database creates a new person differently then MySQL does. But the code outside of this method doesn't care how a person will be added to the database, all it has to know is that the method Create() has 1 parameter (the person object).
    }
}

このように、 Create()メソッドは常に同じ方法で使用されます。 MySqlPersonクラスを使用しているのか、 MongoPersonクラスを使用しているのかは問題ではありません。 メソッドの使用方法は同じままです(インターフェイスは同じままです)。

たとえば、次のように使用されます(コードのどこでも):

new MySqlPerson()->Create($personObject);
new MongoPerson()->Create($personObject);

この方法では、このようなことは起こりえません。

new MySqlPerson()->Create($personObject)
new MongoPerson()->Create($personsName, $personsAge);

複数の異なるインターフェイスよりも、1つのインターフェイスを覚えてどこでも同じインターフェイスを使用する方がはるかに簡単です。

このように、 Create()メソッドの内部は、このメソッドを呼び出す「外部」コードに影響を与えることなく、クラスごとに異なる場合があります。 外部コードが知っておく必要があるのは、メソッドCreate()が1つのパラメーター( $personObject )を持っていることだけです。これは、外部コードがメソッドを使用/呼び出す方法だからです。 外部コードはメソッド内で何が起こっているかを気にしません。 使用方法と呼び出し方法を知っているだけです。

インターフェースなしでもこれを行うことができますが、インターフェースを使用する場合、「安全」です(間違いを防ぐことができるため)。 インターフェイスは、メソッドCreate()が、インターフェイスを実装するすべてのクラスで同じシグネチャ(同じタイプと同じ数のパラメーター)を持つことを保証します。 この方法により、 IPersonServiceインターフェースを実装するすべてのクラスがCreate()メソッド(この例では)を持ち、1つのパラメーター( $personObject )だけが呼び出されて使用されるようになります。

インターフェースを実装するクラスは、インターフェースが行う/持つすべてのメソッドを実装する必要があります。

繰り返してはいけないことを願っています。


この概念は、オブジェクト指向プログラミングのあらゆるところで役立ちます。 私にとって、インターフェースは契約だと思います。 私のクラスとあなたのクラスがこのメソッドシグネチャコントラクトに同意している限り、「インターフェイス」できます。 抽象クラスについては、いくつかのメソッドをスタブ化する基本クラスのように見えるので、詳細を記入する必要があります。


インターフェイスは、開発者が特定のメソッドを確実に実装するためだけのものではありません。 これらのクラスには特定のメソッドが保証されているため、クラスの実際の型がわからなくてもこれらのメソッドを使用できます。 例:

interface Readable {
  String read();
}

List<Readable> readables; // dunno what these actually are, but we know they have read();
for(Readable reader : readables)
  System.out.println(reader.read());

多くの場合、抽象的であろうとなかろうと、基底クラスを提供することは意味がありません。実装は大きく異なり、いくつかのメソッド以外は共通点を共有しないためです。

動的に型付けされた言語には、インターフェイスが不要な「ダックタイピング」の概念があります。 オブジェクトには、呼び出しているメソッドがあると思い込んでください。 これは、オブジェクトに何らかのメソッド(この例ではread())がある静的に型付けされた言語の問題を回避しますが、インターフェイスを実装しません。


インターフェースの全体的なポイントは、クラスに複数のインターフェースの実装を強制する柔軟性を提供することですが、それでも多重継承は許可しません。 複数のクラスからの継承に関する問題は多種多様であり、 wikipediaページでそれらをかなりうまくまとめています。

インターフェイスは妥協です。 多重継承の問題のほとんどは抽象基底クラスには当てはまらないため、最近のほとんどの言語は多重継承を無効にし、抽象基底クラスインターフェイスを呼び出し、クラスが必要な数だけ「実装」できるようにします。


インターフェースは基本的に、作成できるものの青写真です。 クラスが持つ必要のあるメソッドを定義しますが、これらの制限の外に追加のメソッドを作成できます。

メソッドにコードを追加できないということの意味がわかりません-できるからです。 インターフェイスを抽象クラスまたはそれを拡張するクラスに適用していますか?

抽象クラスに適用されるインターフェイスのメソッドは、その抽象クラスに実装する必要があります。 ただし、そのインターフェイスを拡張クラスに適用すると、メソッドは拡張クラスに実装するだけで済みます。 私はここで間違っている可能性があります-私はできる/すべきほど頻繁にインターフェースを使用していません。

インターフェースは、外部開発者のパターン、または物事が正しいことを確認するための追加のルールセットと常に考えていました。


インターフェースは遺伝子のようなものです。

抽象クラスは実際の親のようなものです。

それらの目的は遺伝的ですが、抽象クラスとインターフェースの場合、継承されるものはより具体的です。


他の言語については知りません。そこでのインターフェースの概念は何ですか。 しかし、PHPについては、説明するために最善を尽くします。 ただ我慢してください、そしてこれが助けたならコメントしてください。

インターフェイスは「コントラクト」として機能し、サブクラスのセットが何を行うかを指定しますが、その方法は指定しません。

ルール

  1. インターフェイスをインスタンス化することはできません。

  2. インターフェイスにメソッドを実装することはできません。つまり、メソッドの.signatureのみを含み、details(body)は含みません。

  3. インターフェイスにはメソッドや定数を含めることができますが、属性は含めることができません。 インターフェイス定数には、クラス定数と同じ制限があります。 インターフェイスメソッドは暗黙的に抽象的です。

  4. インターフェイスは、コンストラクターまたはデストラクターを宣言してはなりません。これらはクラスレベルでの実装の詳細であるためです。
  5. インターフェイス内のすべてのメソッドは、パブリック可視性を持っている必要があります。

例を見てみましょう。 2つのおもちゃがあるとします。1つは犬、もう1つは猫です。

私たちが知っているように、犬の鳴き声と猫の鳴き声。これら2つは同じ話す方法を持ちますが、機能や実装が異なります。 ユーザーに発言ボタンのあるリモートコントロールを提供するとします。

ユーザーが話すボタンを押すと、おもちゃが話す必要があります。犬か猫かは関係ありません。

実装が異なるため、これは抽象クラスではなくインターフェイスを使用するのに適しています。 どうして? 覚えている

非抽象メソッドを追加して子クラスをサポートする必要がある場合は、抽象クラスを使用する必要があります。 それ以外の場合は、インターフェイスが選択されます。


抽象クラスとインターフェースは、子クラスに実装する必要がある抽象メソッドを提供するという点で類似していることがわかりました。 ただし、次の違いがあります。

1.インターフェイスには抽象メソッドと定数を含めることができますが、具体的なメソッドと変数を含めることはできません。

2.インターフェース内のすべてのメソッドは、 パブリック可視性スコープ内になければなりません。

3. 1つのクラスは複数のインターフェイスを実装できますが、1つの抽象クラスからのみ継承できます。

                                  interface                      abstract class
the code                     - abstract methods               - abstract methods
                             - constants                      - constants                  
                                                              - concrete methods
                                                              - concrete variables

access modifiers             
                             - public                         - public
                                                              - protected
                                                              - private
                                                                etc.
number of parents          The same class can implement
                           more than 1 interface              The child class can 
                                                              inherit only from 1 abstract class

これが誰もが理解するのに役立つことを願っています!







theory