2011-01-18 6 views
0

php.netから:オブジェクトインターフェイスはいつPHPで便利ですか?

オブジェクト・インターフェースを使用すると、メソッドを指定するコードを作成することができ クラスには、これらのメソッドがどのように処理されるかを定義することなく、実装する必要があります。

なぜ私はそれを行う必要がありますか?それは一種の「ドキュメンテーション」なのでしょうか?

実装する必要があるクラスについて考えているとき、どのメソッドをコーディングするべきか正確に分かります。

クラスとのインターフェイスが「ベストプラクティス」である状況は何ですか?

+3

http://stackoverflow.com/search?q=when+to+use+interfaces+phpにアクセスしてください。それをした後、あなたの質問を更新して、あなたにまだ不明な点を指摘してください。 – Gordon

+0

*(関連)* [インプリメンテーションが実装されていないプログラムは何を意味しますか](http://stackoverflow.com/questions/2697783/what-does-program-to-interfaces-not-implementations-mean) – Gordon

+0

ありがとう、Gorgon。私は関連する回答のリストを得た。できるだけ早く質問を更新します。 – Donovan

答えて

2

短い答え:均一なインターフェイスと多型。

あなたは明らかに、すべてを行うクラスを作成するだけで、実際にどのようなメソッドを書くのか分かります。ただし、具体的なクラスだけで問題を解決するには、変更する能力が欠けています。あなたのユーザをMySQLデータベースに保存するクラスがあるとしましょう。それをUserRepositoryとしましょう。次のコードを想像:それは実際に動作し、データベースへのユーザーを救うとして今

<?php 
class UserRepositoryMysql { 
    public function save(User $user) { 
     // save the user. 
    } 
} 

class Client { 
    public function __construct(UserRepositoryMysql $repos) { 
     $this->repos = $repos; 
    } 

    public function save(User $user) { 
     $this->repos->save($user); 
    } 
} 

を、これは、すべての良いです。しかし、あなたのアプリケーションがpopulairになると想像してください。まもなくPostgreSQLをサポートする質問があります。 UserRepositoryPostgresqlクラスを作成し、UserRepositoryMysqlの代わりにそれを渡す必要があります。さて、あなたはUserRepositoryMysqlをタイプヒントしていますが、どちらのリポジトリも同じメソッドを使用しているとは限りません。さて、独自のストレージを実装する方法については、潜在的な新規開発者のためのドキュメントはほとんどありません。

具体的なクラスではなく、インターフェイスに依存するようにClientクラスを書き換えると、「スワップアウト」するオプションがあります。このため、インターフェイスが正しく適用されたときに、明らかに有用です。

1

まず、私のPHPオブジェクトコーディングは私の.netコーディングの背後にありますが、原則は同じです。あなたのクラスでインターフェイスを使用する利点は何倍もあります。たとえば、検索ルーチンからデータを返す必要がある場合を考えてみましょう。この検索ルーチンは、完全に異なるデータ構造を有する多くの異なるクラスにわたって動作しなければならないかもしれない。 「通常の」コーディングでは、これは様々な異なる戻り値と結婚しようとする悪夢です。

インターフェイスを実装することによって、インターフェイスを使用するclssesに、それがどれほど異なるかにかかわらず、均一なデータセットを生成する責任を追加します。もう1つの例は、さまざまなプロバイダ(たとえばxml、json、csvなど)からデータを取得する場合です。各クラスタイプにインターフェイスを実装することで、インターフェイスを実装する新しいクラスを追加することで、意図した内容を把握しようとするスイッチステートメントのマッシュアップを行うことなく、データフィードを無駄なく拡張できます。

言い換えれば、インタフェースはクラスが「守らなければならない」という「契約」であると考えてください。それは、実装の詳細だけが変わっても、与えられたシナリオに対して自信を持ってコーディングできることを意味します。

これが役に立ちます。

[編集] - かなり簡単な説明については、SOに、この例を参照してください。

インタフェースはポリモーフィズムを可能オブジェクト指向プログラミングにおける概念です。基本的にインタフェースは、彼らがインターフェイス

purpose of interface in classes

0

を使用し、他のクラスは、あなたが作成していると言うのと同じ方法を使用することができるようにされてそれを実装するクラスは、特定の機能を提供することに同意することを、契約書のようなものですデータベース抽象化レイヤー。これらのメソッドを特定のデータベースの特定のコマンドに変換するデータベースおよびアダプタクラスとのインターフェイスのための一般的なメソッドを提供する1つのDALオブジェクトを提供します。これらのアダプター自体に汎用インターフェースが必要であるため、DALオブジェクトは標準化された方法でそれらと通信できます。

インターフェイスを使用してアダプタに必要なインターフェイスを指定できます。もちろん、アダプタに必要なメソッドを指定するドキュメントを書くだけで、コードで記述することで、このインターフェイスを実装することができます。これは、PHPが1行のコードが実行される前に有用なエラーメッセージを投げることを可能にします。それ以外の方法が見つからない場合は、実行時にのみ呼び出すことができます。実際に呼び出しようとすると、デバッグが非常に困難になり、コードははるかに信頼性が低くなります。

1

私が気になる最初のケースは、別のクラスの特定のメソッドを使用するクラスがある場合です。この第二のクラスの仕組みは気にしませんが、特別な方法が必要です。

例:

interface IB { 
    public function foo(); 
} 

class B implements IB { 
    public function foo() { 
     echo "foo"; 
    } 
} 

class A { 
    private $b; 
    public function __construct(IB $b) { 
     $this->b = $b; 
    } 

    public function bar() { 
     $this->b->foo(); 
    } 
} 

$a = new A(new B()); 
$a->bar(); // echos foo 

今、あなたは簡単にクラスAのインスタンスに渡された別のオブジェクトを使用することができます

class C implements IB { 
    public function foo() { 
     echo "baz"; 
    } 
} 

$a = new A(new C()); 
$a->bar(); // echos baz 

を同じバーメソッドが呼び出されることに注意してください。

継承を使用しても同様の結果が得られますが、PHPでは複数の継承をサポートしていないため、インターフェイスはより優れたクラスで複数のインターフェイスを実装できます。

PHP design patterns - Strategyのいずれかを確認できます。

関連する問題