2017-01-17 7 views
-2

私はこれらのインタフェースをSymfonyや他のプロジェクトで見ることがあります。通常、セッターとゲッターを保持するだけで、インターフェースからメソッドを実装する必要があるクラスを実装します。phpの認識可能なインターフェースの使用方法は?

私はここに付加価値は表示されません。既存のクラスに認識可能なインタフェースを追加する必要があるため、4-5の実装ではなく単にメソッドを追加するだけです。

はい、あなたはクラスができることを簡単に見ることができますが、メソッドに基づいてこれを見ることもできますし、私の目では実際に何かを追加しない多くのインターフェイスを提供します。

誰かが私がPHPでこれらを使用している理由を説明できますか?私は彼らがJavaの場所を持っているかもしれないことを知っています(私はSpringから始まったと思います)。しかし、私はここで値を見ていない。

+0

これは一般的にインターフェイスの価値が何であるか聞いているようです。 – Carcigenicate

+0

@Carcigenicateインターフェイスに対してのヒントと具体的な実装からの再利用性/デカップリングは全く異なるものです。私は一般的なインターフェイスの値を参照してください。私は、クラスを構築するために4-5のインターフェースを接続することで値を見ません。 –

+1

私はちょうど明確にしたいと思った。私は "気づいている"か "有能な"インターフェースが何を表しているのか分かりませんが、単に "メソッドを追加するだけではどうでしょう..."と言われたとき、一般的にインターフェースを使うことに反対する人のようでした。そうでない場合はNvm。 – Carcigenicate

答えて

1

Symfonyフレームワークの場合、ContainerAwareInterfaceを使用して、クラスを必要とするクラスを「フラグ」します。特に、コントローラはオプションでインタフェースを実装することができます。

コントローラが要求ハンドラによってインスタンス化されると、コントローラがインタフェースを実装すると、コンテナが注入されます。おそらくハックのビットですが、実際には、特定のクラスのグループを特別に処理するインターフェイスを使用するとうまくいきます。必ず文書化してください。

また、フレームワークのそれ以降のバージョンでは、実際にsetContainerメソッドを実装する必要性を排除するContainerAwareTraitが用意されています。

-2

あなたのクラスを説明する青写真としてインターフェイスを考えるようにしてください。

インターフェイスを使用する主な理由は、実装をスワップする機能として提供されることです。

クラスがインターフェイスを実装する場合、インターフェイスに定義されているこれらのメソッドを提供する必要があるという契約に署名します。この2つのクラスがこの特定のインタフェースを実装しているとします。今、彼らはこれらの方法を提供する契約を結んだ。ここまでは順調ですね。あなたがよく聞くかもしれない言葉は、インターフェイスへのプログラムです。 2つのクラスが契約を実装する場合、自由にスワップできます。以下の例を考えてみましょう。

interface CarInterface 
{ 
    public function hasName(); 
    public function hasEngine(); 
    public function accelerate(); 
} 

class toyota{ 
    public function hasName(){ 
    //implementation 
    } 

    public function hasEngine(){ 
    //implementation 
    } 

    public function accelerate(){ 
    //implementation 
    } 
} 

class opel{ 
    public function hasName(){ 
    //implementation 
    } 

    public function hasEngine(){ 
    //implementation 
    } 

    public function accelerate(){ 
    //implementation 
    } 
} 

今、私たちは車を必要とする1つのクラスを持つことができます。

class circuit{ 

protected $car; 

public function __construct(CarInterface $car) 
    { 
     $this->car=$car; 
    } 

public function startRace(){ 
    $this->car->accelerate(); 
} 


} 

[OK]を、私たちはgo.Imagineに設定されている私たちは、クラス回路をinstatiateする必要があります。その新しいインスタンスにオブジェクトを渡さなければなりませんが、どのオブジェクトですか?インタフェースを実装するANYオブジェクト型キャストしたので、具体的な実装ではなくインターフェイスにプログラミングしました。

$circuit = new circuit(new toyota); 
$circuit->startRace(); 

私たちはオパール車を走らせる回路が必要なので、後でそれを変更する必要があります。問題ない。

$circuit = new circuit(new opel); 
$circuit->startRace(); 

インターフェイスにプログラミングしたので、実装を自由に交換できます。これが主な利点です。私がここで話す科目について読んでください。あなたの頭をこのコンセプトの周りに包み込むのは難しいですが、一度使用すればいつでも使用できます。今は少しはっきりしていることを願っています。

+0

これは一般的なインターフェースではありません。コンポジションと継承の関係、なぜ誰かが複数のインターフェースを実装するのか、それとも1つのインターフェースを実装するのかについてです。 –

+0

プラス、それは質問とは関係ありません。 – Cerad

関連する問題