2

私は現在、自分のページを少し速く構築するために、いくつかの素晴らしいクラスを構築しようとしています。

私は現在、このセットアップを持っています、

// page class
class Page extends DBC {
    // creates a page
    public function create($data = false) {
       echo 'SOME BASIC HTML TO SETUP PAGE';
       // pass the database connection var to content function
       content($this -> $dbc, $data);
       echo 'SOME BASIC HTML TO SETUP PAGE';
    }
}
// dbc class
class DBC {
    public $dbc;
    public function __construct() {
        // sets the database connection
    }
}

そして、作成する新しいページごとに、クラスをスクリプトに要求した後にこれを行います。

// content function
function content($dbc) {
    // some content
    // am able to use dbc
}
// new page object
$page = new Page();
// am able to use dbc var fine here too
$page -> dbc -> // execute a query
// create page
$page -> create();

しかし、私が今直面している問題はDBC、クエリの構築を高速化するためにクラス内に関数を作成する最善の方法です。クラスに次の関数を追加してみましたがDBC

public static function query($q, $data, $options = array()) {
    // execute prepared query
    $q = $this -> dbc -> prepare($q);
    return $q -> execute($data);
}

contentただし、データベース接続のみが渡され、クラスquery内の関数DBCはオブジェクトコンテキストで接続を使用するため、関数内でこれを使用することはできません。

私の問題を説明した後の私の質問は次のとおりです。

DBCクラス内でクエリを実行staticし、既存の接続を渡すだけの関数を作成するのが最善でしょうか?

また

DBC以下のように、オブジェクト全体をクラスcontent内の関数に渡すほうがよいでしょうか。Page

content(new DBC(), $data);

そうすれば、オブジェクト コンテキストで関数を使用できるようになります。関数の外でも varを使用する必要があるためPage、クラスはクラスによって拡張する必要があります。しかし、これにより、クラスの2つのインスタンスが、拡張されたときに1つになり、関数に渡されたときに1つになりますか?DBCdbccontentDBCPagecontent

この質問を読んでくれてありがとう、そして答えてくれてありがとう!

4

2 に答える 2

1

MVC (Model-View-Controller) パターンを調べる必要があります。html/Page コードとデータベース コードを混在させたくありません。時間をかけてデータベース アクセス レイヤーを作成する場合は、表示コードとデータ コードを分離する必要があります。

MVC を完全に分離するのが現時点では難しすぎる場合は、データベース アクセスにリポジトリ パターンを使用することをお勧めします。Page クラスからアクセスできる簡潔なシステムで必要なデータベース メソッドを提供します。

この質問に対する受け入れられた回答には、良い情報があります: MVC でのリポジトリ パターンの設定

于 2012-06-14T20:36:10.530 に答える
1

私が理解していることによると、要件に応じて見て改善できるように、例が最適だと思います。私がgithub
に書いたこのクラスを チェックしてください そして、使用法に関するこの要点をチェックしてください だから私が言っているのは、それを見て、あなたのニーズに合った解決策を考え出すか、それを使うことができるということです...もちろん無料です

于 2012-06-14T20:39:59.500 に答える