我目前有多个类都依赖于一个类Database类。每个类都需要一个Database类的实例来运行,有了这个,我有点担心。
在我将所有程序代码转换为面向对象的代码之前,我需要弄清楚这一点。我目前有整个程序的一个数据库连接。但是,根据我的理解,当我将代码转换为OOP时,我将在同一程序中拥有多个具有开放数据库连接的类。 (所有这些类都将包含在主程序文件中)。
如何正确实现?我假设在同一个程序中有5个打开的数据库连接肯定不是正确的方法。
答案 0 :(得分:1)
如果您有依赖于数据库抽象的类,那么依赖注入是可行的方法。
class PDOProvider extends PDO
{
public function __construct()
{
try {
parent::__construct(...);
$this->setAttribute(....);
} catch(PDOException $e){
die($e->getMessage());
}
}
// ...
}
class Users
{
private $provider;
public function __construct(PDOProvider $provider) // <- Injecting class dependency
{
$this->provider = $provider;
}
public function insert(array $stuff)
{
try {
$this->provider->prepare("INSERT ...");
$this->provider->execute(array(..));
} catch(PDOException $e){
//...
}
}
}
答案 1 :(得分:0)
您可以通过将它作为参数提供给构造函数来共享多个不同对象之间的数据库连接,或者您可以创建一个单例来为其他类提供数据库连接。
将数据库连接传递给构造函数
class Foo {
private $database = null;
public function __construct(&$database) {
$this->database = $database;
}
}
$connection = mysql_connect(..);
$bar = new Foo($connection);
<强>的Singleton 强>
class DatabaseConnection {
private static $instance = null;
private function __construct() {
}
public static function &getInstance() {
if (DatabaseConnection::$instance == null) {
DatabaseConnection::$instance = new DatabaseConnection();
}
return DatabaseConnection::$instance;
}
}
$mysql_query("...", DatabaseConnection::getInstance());
&amp;表示通过引用传递,因此即使在几个不同的文件,类或函数中使用它,也只有一个数据库对象的实例。有关详细信息,请参阅http://php.net/manual/en/language.references.pass.php。
答案 2 :(得分:0)
Jakobs关于使用Singleton +聚合的建议是合理的建议。 为此,我添加了Doctrine ORM / DBAL,http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/getting-started.html
通过在“Foo”类中使用它们,避免将单例实例直接耦合到对象,而是将单例实例传递给构造函数。通过这种方式,您可以获得更多的解耦,从而获得更多的自由。