web-dev-qa-db-ja.com

プライベート/プロテクトされたメソッドを持つインターフェースを持つことは可能ですか?

PHP 5では、private/protectedメソッドを持つインターフェースを使用できますか?

今私は持っています:

interface iService
{
    private method1();
}

エラーがスローされます:

解析エラー:構文エラー、予期しないT_STRING、T_VARIABLEが必要

インターフェイスにパブリックメソッドのみを含めることができるということを確認したいだけです。

67
teepusink

インターフェイスに関するPHPマニュアルページ は明示的に述べています:

インターフェイスで宣言されたすべてのメソッドはパブリックでなければなりません。これがインターフェイスの性質です。

私はこれがあなたが得ているエラーを説明していると思います;-)

118
Pascal MARTIN

インターフェイスは、そのインターフェイスを実装するクラスのパブリックメソッドを記述するために使用されます。インターフェイスにプライベートメソッドを含めることはできません。インターフェイス内のメソッドはすべて使用中であると想定されており、変更しないでください。

インターフェース はPHPリンクですが、これはOOプログラミングの標準です。

20
ryanday

一般に、インターフェイスの機能は継承されるため、インターフェイスにはパブリックメンバーのみを含めることができます。

PHPfreaks.comチュートリアルから:

PHP5はインターフェースを備えています。より一般的な意味でインターフェイスと混同しないように、interfaceキーワードは、抽象クラスのように拡張することなく、クラスに共通インターフェイスを適用するために使用できるエンティティを作成します。代わりに、インターフェースが実装されます。

インターフェイスは抽象クラスとは異なります。 1つは、実際にはクラスではありません。プロパティを定義せず、動作も定義しません。インターフェイスで宣言されたメソッドは、それを実装するクラスで宣言する必要があります。

より一般的な意味でのインターフェースは、オブジェクトと他のコードとの相互作用の定義であるため、すべてのメソッドをパブリックとして宣言する必要があります(この章の可視性のセクションを参照)。抽象クラスを使用すると、抽象メソッドは任意の可視性を持つことができますが、拡張クラスは同じ(または弱い)可視性を実装で使用する必要があります。インターフェイスを実装すると、メソッドが抽象メソッドとしてサブジェクトクラスに追加されます。実装に失敗すると、次のようなエラーが発生します。

致命的なエラー:クラスSomeConcreteClassにはn個の抽象メソッドが含まれているため、抽象として宣言するか、残りのメソッドを実装する必要があります。はい、抽象クラスはインターフェイスを実装できます。

9
Webleeuw

インターフェイスは型宣言です。タイプは値のセットに加えて、外部からそれらに実行できる操作のセットです。プライベートメソッドはこの図には適合しません。

interface T {
  public /*int*/ function f(array $a);
}
interface U {
  public /*T*/ function g(T $t);
}

class C implements U {
    public function g(T $t) {
        ...
        $x = $t->f();
        ...
    }
}

インターフェイスは、オブジェクトのインターフェイスを示しているため便利です。オブジェクトが環境と通信する方法。

では、T::fはプライベートとして宣言できます。それは他のオブジェクトにどのように役立つでしょうか?外部から呼び出すことはできず、インターフェイスの一部にもなりません。

6
just somebody

多くの場合、インターフェイス定義は、他のモジュールがクラスの動作とAPIを保証するのに役立ちます。これらの場合、プライベートメソッドは、他のモジュールがアクセスまたは理解できるものではありません。そのため、インターフェイスにプライベートメソッドを配置することはできません。

3