2016-11-02 15 views
0

例えば、私はクラスがMySQLクエリを実行し、私はこのクラスをカプセル化したいと言う。これはPHPでのカプセル化の良い習慣ですか?

class SqlQuery { 

    private $database_connection_obj; 

    public function __construct($dbh) { 
    $this->$database_connection_obj = $dbh; 
    } 

    public function runQuery($query, $params) { 

    //run query implementation... 

    } 

} 

カプセル化と情報の隠蔽は、私は機能runQuery()はので、私はそれをプライベートにし、プライベート関数runQuery()にデータを渡す唯一の目的と方法exacuteQuery()を追加し、公開すべきではないので、クラスメソッドへの直接アクセスを閉鎖することを意味します。

最終的には上記のコードとまったく同じように動作するので、実際にどのように使用するのですか? プライベートメソッドに渡す前にパブリックメソッドで行われた入力データの衛生管理が必要か、またはこの余分なコードを書くのはなぜですか?

class SqlQuery { 

    private $database_connection_obj; 

    public function __construct($dbh) { 
    $this->$database_connection_obj = $dbh; 
    } 

    public function exacuteQuery($external_query, $external_params) { 
    $this->runQuery($external_query, $external_params); 
    }  

    private function runQuery($query, $params) { 

    //run query implementation... 

    } 

} 
+0

与えられたコードで 'runQuery()'をラップする理由はありません。なぜあなたはその種のラッパーでコードを複雑にする必要があると思いますか? =) –

+0

カプセル化とは何ですか?私に例を挙げてください。 –

答えて

1

与えられた詳細は違いはありませんが、仕事に依存します。私は直接アクセスすることができない関数を作成しなければならないときに、そのメソッドを使用するだけで何度も使用します。コードを最適化し、コード外のアクセスを拒否します。そうしなければ、有害な可能性のあるパラメータを変更することができます。

+0

例を挙げてください。 –

+0

私はしばしば電子メールのためにそれを使用します。特定の条件の後のメソッドだけが他のメソッドによってしか送信できないプライベートメソッドです。これは例です –

2

主なアイデアは、クラスは部外者(すなわち、他のクラスや関数、クラスのインスタンスを保持しているが)、それは内部的にどのように動作するかは考えていないことを意味し、black boxesのように見えるようにすることです。それらに抽象です。

クエリの内部動作は、クエリを保持しているクラスにとって重要ではなく、クエリの実行についてのみ気にします。クエリは、特に、非常に低レベルの抽象化である

注意、それが標準ライブラリ関数/オブジェクトへの直接呼び出しを行うに比較的近いです。しかし、低レベルの抽象化があれば、より高いレベルの抽象化を行うことができます。

たとえば、UserStoreは、内部でSqlQueryオブジェクトを使用して、Userオブジェクトをデータベースに取得して設定します。 UserStoreを使用してクラスがUserStoreが内部SqlQueryオブジェクトを使用している、それはちょうどそれがUserオブジェクトを保存および取得できるオブジェクトだということを知っていることを認識していません。

「離れて隠し」とのこの種の今のクラスは、特定の実装の詳細に依存することなく、他のクラスを使用することができますので、実際にあなたに多くの電力を与える「カプセル化」。明日あなたはUser Sを保存する方法を変更したい場合は、あなただけであれば、同じパブリックAPIを持っているとして、あなたのアプリケーションの残りの部分も何かすることを認識していないだろう、UserStoreクラスに変更を加えますかわった。

+0

私は理論を持って、私の質問はPHPでの実装については、私が提供する必要があります最初または2番目のコードの例を言うだろうか?なぜ。 –

+0

ああ、お詫び申し上げます。具体的には、同じシグニチャを持つプライベート関数にのみ委譲するパブリック関数を作成することには利点はありません。私の持っている 'select()'と 'update()'の共通の機能のように、クエリを準備する必要があります。パブリックが両方の人が呼び出すプライベート関数。 –

関連する問題