3

だから私はPHPで成長し続けるシステムを持っており、データベース接続を処理する静的クラスがあります。

<?php 
    class Database {
        // ... connection upon construction and ways of escaping the data
        public function query($query) {
            // performs query and returns the data.
        }
    }

    class API { // Not actually called api, but for the purposes of this
        private static $database = false;

        public static function GetDatabase() {
            if (static::$database === false) {
                static::$database = new Database(connection information)
            }
            return static::$database;
        }
    }
?>    

また、特定の機能セットを実行する「コントローラー」またはデータベース アダプターも多数あります。

<?php 
    class UserDBAdapter {
        public function newUser($info) {
            // validates and builds the query statements

            API::GetDatabase()->query($query);
        }
    }
?>

したがって、本当の問題は、コード全体のあちこちで UserDBAdapter が必要だということです。いくつかの異なるファイルで、おそらく他のコントローラーで言ってください。変数として渡したくありません(すべてのメソッドにあると面倒になる可能性があります)。また、これらのオブジェクトを 2 つ作成したくありません (速度向上のため)。

$database オブジェクトで行うのと同じことを行うことができますか。呼び出されるまで初期化しません。これは効率的であり、スコープに関係なく、プロセス全体で再作成する必要はありません。少なくともそれが私がこのアイデアを始めた理由ですが、それが最良のアイデアかどうかはわかりません.

ありがとう

4

2 に答える 2

2

プロジェクト全体で簡単にアクセスできるレジストリにデータベース接続を保存しています。

理想的には、API::getDatabase() をフォールバックとして使用して、他のクラスの setDatabase および getDatabase メソッドでもこれを上書きできると思いますか?

Zend Framework には Zend_Db_Adapter::getDefaultAdapter() があり、これを使用することが知られています。または、Zend_Registry::set('dbAdapter', $dbAdapter) を使用してアダプタをレジストリに割り当てます。あなたが Zend を使用していないことは知っていますが、これは誰かが似たようなことをしている例です。

于 2011-12-14T20:47:47.473 に答える
0

通常、あなたが言及する「コントローラー」は、別のファイルで別のクラスとして管理されます。

場合によっては、すべてのアプリケーションで使用される 1 つのアイテムを「シングルトン」と呼びます。また、用途によっては複数のコピーがあり、「エンティティ」と呼ばれることもあります。

ここで詳細を学ぶことができます: http://en.wikipedia.org/wiki/Object-Relational_Mapping

于 2011-12-14T20:45:36.860 に答える