7

GitHub を調べてみると、ほとんどのプロジェクトは次のようにインターフェースでメソッドを定義しています。

interface ExampleInterface
{
    function getId();
}

私の質問は、インターフェイスでメソッドの可視性を定義するのがなぜ悪いスタイルなのかということです:

interface ExampleInterface
{
    public function getId();
}

インターフェースをより厳密にしますが、それはインターフェースが何に使用されるのでしょうか?

4

5 に答える 5

12

インターフェイスのプライベート関数のポイントは何ですか? 宣言publicは冗長です。

TFM より:

All methods declared in an interface must be public, this is the nature of an interface.

http://php.net/manual/en/language.oop5.interfaces.php

于 2012-05-28T11:05:22.330 に答える
5

インターフェースは、特定の機能を外の世界に与える約束だからです。上記の例では、クラスがインターフェイスを実装するたびに、実装方法に関係なく、クラスがgetId外部の世界に呼び出されるメソッドを提供することが保証されます。

したがって、 private を作成した場合promise、何らかの機能を備えた private メソッドが存在するかどうかは誰も気にしないため、関係がありません。とにかく、他の誰もアクセスできません。

一方、インターフェース内のすべてのメソッドは本質的に公開されているため (それらは外界への約束に過ぎないため)、public冗長であると明示的に言及します。

于 2012-05-28T11:07:41.113 に答える
2

プライベートは機能しないが、保護されていることは理解できますか?

私はそれが外界への「約束」であることを理解していますが、何かがインターフェースを実装している場合、そのメソッドは保護されたままになるため、同じ「約束」が引き続き保持されます。関数a、関数b、および保護された関数cがあると述べられているため、これを拡張/実装していない場合、関数cにアクセスできません。クラスを読むときと同じように機能するからです。

@AlphaMaleでは、インターフェースのポイントは何ですか?クラスの「レシピ」を作成するために使用されますよね?したがって、実際にコードで使用する場合は、メソッドを実装して強制するだけです。これは、コードが機能するためにメソッドが必要であり、特定のクラスに強制したくない場合に便利です。

メーラーを作成する必要があるとしますが、メールが必要な主要なプロセスを実行する必要がありますが、メーラーはこれらのメールを作成するさまざまな方法を使用します。メッセージ(任意のタイプ)と電子メールアドレスを受け取る基本送信関数が必要ですが、クラスはオープン環境にあるため、この送信関数をパブリックのままにしておくのは危険であるため、保護されたものとして必要です方法。2 つのプロセスには複数のメーラーがありますが、各プロセスはメソッドを構築する同じ方法を共有しているため、2 つの抽象クラスがありますが、インターフェイスが制限されているため、この保護された送信関数を含む 3 つ目の抽象クラスを宣言する必要があります。拡張することもできます。それ以外の場合は、同じ保護された送信機能が得られます。新しい開発者がまったく新しいプロセスで作業し、インターフェースを見た場合、送信機能が強制されることはありません。インターフェースで protected を宣言することが可能であると言った場合、何かがインターフェースであるかどうかを確認すると、クラスと同じように機能しますが、保護された関数にアクセスすることはできません。

インターフェイスだけがこれらの値を認識し、インターフェイスは何もできないため、これは無意味になるため、プライベートは理にかなっています。

于 2014-10-22T13:15:34.443 に答える
2

インターフェイスには public メソッドのみを含めることができるため、public は少し冗長です。

于 2012-05-28T11:05:56.607 に答える
2

インターフェイスはパブリック メンバーのみを持つことができるため、宣言する必要はありません。そして、これらの関数は継承されることを意図しています。したがって; インターフェースで宣言されたすべてのメソッドは、その性質上、パブリックでなければなりません..

于 2012-05-28T11:09:09.390 に答える