1

PHPでWebアプリケーションを開発しています。データベース接続を使用する多くのクラスがあります。

これは私が一般的に使用する構造です。

class SomeClass {
    private $db;

    function __construct(mysqli $db) {
        $this->db = $db;
    }

    function SomeFunction() {
        $this->db->query(...);
    }
}

そして、これが私が使用すると思ったものです。

class Common {
    public static DB = new mysqli(...);
}

class SomeClass {
    function SomeFunction() {
        Common::DB->query(...);
    }
}

私の質問には 2 つの部分があります。

  1. どちらがより良い練習ですか?最初のものを使用する場合、db を使用するすべてのクラスにデータベース オブジェクトを渡す必要があります。2番目のものを使用すると、すべてのクラスがdbを使用し、Commonクラスに依存します。

  2. 例をより簡単にしました。実際には、データベースクラスがmysqliを拡張し、データベースクラスを使用してデータベーステーブルマネージャークラスがあります。Database クラスに GetTable() 関数を追加します。この関数 ( return new DatabaseTableManager($this, $tableNameFromArgument)) で DatabaseTableManager オブジェクトを作成するので、毎回 db オブジェクトを渡す必要はありません。DatabaseTableManager クラスでは、仕事を簡単にするためにいくつかのクエリを作成しました。

たとえば、レコードをテーブルに挿入します。

$DB = new Database(...);
$myTable = $DB->GetTable('myActualTableNameInDatabase');
$myTable->Insert( array('col1' => 'val1', 'col2' => 'val2') );

だから私はこのクラスを他のクラスでよく使っています。当然、これらのクラスはすべて DatabaseTableManager クラスに依存します。より良い解決策は何ですか?

4

3 に答える 3

2

より良い解決策は何ですか?

何が問題ですか?:)ですから、まず、一般的な設計の観点から、グローバルな静的状態を導入しないことでメリットが得られると言われています。これにより、シングルトンとグローバル変数の使用が無効になります。

これにより、多くの選択を行う負担が軽減されます。必要なMysqli接続オブジェクトを、そのコンストラクターを介してそれを必要とするクラスに渡すことは問題ありません。「常に渡す」ことが心配な場合は、これらのオブジェクトを作成する場所を定義してください。

実際、「テーブルマネージャー」についてはすでにそれを行っています(マネージャーはそれほど良い用語ではないかもしれません(データベース内のテーブルを管理せず、単にテーブルを表すだけです)が、最初に構造に焦点を当てましょう)。そのクラスは、テーブルを表すオブジェクトを生成します。

これらを消費しているアプリケーションのその部分については、その詳細をカプセル化しているため、どの種類のデータベースが背後にあるかを知る必要さえありません。

当然、テーブルマネージャー自体もその知識を持っている必要があります。ただし、これを変更する必要がある場合は、中央の場所で変更できるため、これは問題ありません。

ですから、実際には、問題を探したいと思っていても、作成したものは実際にはかなりよく見えます。

もちろん、いつものように問題が発生する可能性がありますが、アプリケーションでデータベースを使用する方法が一般的にテーブルベースである場合、これは私にはそれほど間違っているようには見えません。実装したパターンは、 ActiveRecordの方向に進む可能性があります。これは、トランザクションスクリプトを持つ中小規模のアプリケーションに適していることが知られています。

于 2012-09-30T15:41:59.103 に答える
0

私はそれをあなたが今持っているままにしておきます:

  • あなたSomeclassは他のクラスに依存していません。
  • 構築時にDBを注入します。これはテストに最適です。
  • それは関心の分離です。
  • この構成は、制御の反転コンテナと組み合わせて、実際の依存性注入に変換するのが最も簡単です。
于 2012-09-30T15:40:43.870 に答える
0
  1. 場合によります。行ポインターの状態を引き継ぎますか? その場合は、Common クラスを作成してください。設計の観点からは、データベースに依存するコードは何らかの抽象化に依存することを余儀なくされるため、最も柔軟なものを選択してください。個人的には、DB オブジェクトを用意して、それを渡します。シングルクラスには利点があるかもしれません。より具体的な例を書いていただければ、より良い回答を提供できるかもしれません。

  2. 不必要に 2 つのクラスを作成したり、継承を追加したりするのではなく、データベース クラス内にメソッドを配置してみませんか? オブジェクトまたは変数を関数に渡すことは、何かが状態を追跡していない限り、通常の動作です。Database および DatabaseTableManager クラスのより完全な例を提供できますか?

于 2012-09-30T15:29:17.457 に答える