我正在尝试基于面向对象的方式设计我的网站,但是我在设计数据库连接时遇到了困难。目前,我正在一个抽象类Connector中创建一个私有静态PDO对象。显然,需要与数据库交互的任何内容都将扩展此类。我一直在考虑如何确保一个脚本中只有一个连接或PDO对象,因为有些页面将需要多个扩展Connector类的类。许多人似乎推荐使用单例模式来实现这个目的,但我目前的做法似乎也能达到相同的效果。
以下是我的当前代码。
从理论上讲,我想每个子类的实例应该始终访问同一个PDO实例。这段代码是否合理?我是否对静态属性有误解?这是不良设计/实践还是单例模式有更多优势?
如有不清楚之处,请留言。谢谢!
编辑:Connector类并非只用于保存PDO对象。其析构函数关闭连接(将其置为null),并包含isValueTaken等函数,用于检查值是否已存在于数据库中。它具有以下抽象函数。
例如,我有一个扩展Connector的User类。它定义了setData()方法来在数据库中注册用户。我不知道这是否对响应产生影响。
以下是我的当前代码。
abstract class Connector
{
private static $dbh;
public function __construct()
{
try
{
self::$dbh = new PDO(...);
self::$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
die($e->getMessage());
}
}
public function getDB()
{
return self::$dbh;
}
}
然后任何子类都可以像这样使用它。
class Subclass extends Connector
{
public function interactWithDB()
{
$stmt = $this->getDB()->prepare(...);
// etc...
}
}
从理论上讲,我想每个子类的实例应该始终访问同一个PDO实例。这段代码是否合理?我是否对静态属性有误解?这是不良设计/实践还是单例模式有更多优势?
如有不清楚之处,请留言。谢谢!
编辑:Connector类并非只用于保存PDO对象。其析构函数关闭连接(将其置为null),并包含isValueTaken等函数,用于检查值是否已存在于数据库中。它具有以下抽象函数。
abstract function retrieveData();
abstract function setData();
例如,我有一个扩展Connector的User类。它定义了setData()方法来在数据库中注册用户。我不知道这是否对响应产生影响。