我对设计模式的概念比较陌生,我正在考虑使用依赖注入和多态(因为每个都适用) - 但是我有很多单身人士,虽然他们中的大多数很容易被改变,但我的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;
}
// ...
}
?>
会有很多类继承这个类 - 处理这个问题的最佳方法是什么? (我是设计模式的新手)
答案 0 :(得分: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);
};
但问问自己为什么你不想使用单身人士。
如果它看起来像一个单身,闻起来像一个单身,并且你像单身一样使用它,那么单身模式可能最适合这项工作。
答案 1 :(得分: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;