为何我的PDO数据库连接类返回object(PDO)[2]?单实例连接疑问
这是完全正常的,别担心!
首先明确:object(PDO)[2]里的[2]不是表示存在两个PDO实例,它是PHP为当前请求中的对象分配的全局实例ID——计数范围覆盖整个请求生命周期内的所有对象,而非针对某个类单独计数。
为什么会显示[2]?
看你的代码执行流程就明白了:
- 当你执行
$new = new DBConnection();时,创建了当前请求的第一个对象——DBConnection实例,它的全局ID是[1]。 - 接着在
DBConnection的构造函数中调用getConnection(),第一次创建PDO对象,这是请求中的第二个对象,所以它的ID是[2]。
你可以做个小验证,在构造函数里先打印当前的DBConnection对象:
public function __construct() { require_once( 'database.config.php' ); // ... 其他配置赋值代码 var_dump($this); // 会输出 object(DBConnection)[1] var_dump($this->getConnection()); // 输出 object(PDO)[2] }
确认你的连接确实是单例的
你的代码已经通过if ($this->connection == NULL)的判断实现了单例连接逻辑——只会创建一次PDO实例。可以加个调试输出验证:
private function getConnection() { if ( $this->connection == NULL ) { echo "Creating new PDO connection...\n"; // 调试用输出 $dsn = "$this->driver:host=$this->host;dbname=$this->name;charset=$this->charset"; try { $this->connection = new PDO($dsn,$this->user, $this->pass); $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch ( PDOException $error ) { echo 'Connection failed: ' . $error->getMessage(); } } return $this->connection; }
不管你在代码里调用多少次getConnection(),只会看到一次Creating new PDO connection...的输出,说明确实只有一个PDO实例在运行。
小优化建议
如果想严格确保这个连接类不会被意外克隆出多个实例,可以在类里添加私有克隆方法:
private function __clone() {}
内容的提问来源于stack exchange,提问作者Frederick M. Rogers
相关产品推荐
相关产品推荐

