1

私はデザインパターンの概念にかなり慣れておらず、依存性注入とポリモーフィズムを使用することを考えています(それぞれが適用可能です)-しかし、私は多くのシングルトンを持っており、それらのほとんどは簡単に変更できますが、私のDBALはできません。

DBALがデータベースへの接続を作成する理由は、独自のPDOオブジェクトを設定することです。新しいDBALをそれを必要とするすべてのクラス(かなりの数)に渡すと、データベースへの複数の不要な接続が発生します。

クラスはこんな感じ

class DB {
    /**
     * Hold the PDO object
     * @var PDO
     */
    private $_db;

    /**
     * Hold the last error messages
     * @var string
     */
    private $_error_message = NULL;

    /**
     * Hold the last error code
     * @var int
     */
    private $_error_code = NULL;

    /**
     * Connects to the database server and selects a database
     *
     * @param string $user MySQL database user
     * @param string $password MySQL database password
     * @param string $name MySQL database name
     * @param string $host MySQL database host
     * @return bool
     */
    public function connect( $user, $password, $name, $host ) {
        // Connect
        try {
            $this->_db = new PDO( "mysql:host=$host;dbname=$name", $user, $password );
        } catch ( PDOException $e ) {
            $this->_error_message = $e->getMessage();
            $this->_error_code = $e->getCode();
            return false;
        }

        return true;
    }

    // ...
}
?>

このクラスを継承する多くのクラスがあります-これを処理するための最良の方法は何ですか?(私はパターンのデザインに不慣れです)

4

2 に答える 2

2

別の方法は、レジストリを使用することです。

$db = new DB($host, $user, $pass);
Config::set('db', $db);

// Inside other classes
Config::get($this, 'db'); 
// Passes $this so the config can override the DB for different classes

ここでの問題は、Configシングルトンになってしまうことです。

本当に DI を行うには、基本的にオブジェクトを他のすべてのオブジェクトに渡す必要があります。

$db = new DB($host, $user, $pass);
$user = new User($db);
// Or with a DI container
$c = new Pimple();
$c['db'] = function() {
    return new DB($host, $user, $pass);
};

しかし、シングルトンを使用したくない理由を自問してください。

それがシングルトンのように見え、シングルトンのような匂いがし、それをシングルトンのように使用する場合、シングルトン パターンがおそらくその仕事に最適です。

http://pimple.sensiolabs.org/

于 2012-07-04T18:02:30.820 に答える
1

クラスに追加します。

private function __construct($user, $password, $name, $host ){
  connect( $user, $password, $name, $host );
}

public static function getInstance(){
    if(self::$_db == NULL) self::$_db = new DB;
    return self::$_db;
}

そして以下を変更します。

// change $_db to be static!
private static $_db = NULL;
于 2012-07-04T17:23:49.923 に答える