php,class DB {, private static $instance;, private $conn;,, private function __construct() {, $this>conn = new mysqli('localhost', 'username', 'password', 'database');, },, public static function getInstance() {, if (!self::$instance) {, self::$instance = new DB();, }, return self::$instance;, },, public function getConnection() {, return $this>conn;, },},``在PHP中,我们可以使用单例模式来确保一个类只有一个实例,并提供一个全局访问点,以下是一个简单的数据库单例模式的实现代码:

<?php
class Database {
private static $instance = null;
private $connection;
private function __construct() {
// 初始化数据库连接
$this>connection = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
}
public static function getInstance() {
if (self::$instance == null) {
self::$instance = new Database();
}
return self::$instance;
}
public function getConnection() {
return $this>connection;
}
}
?>
在上面的代码中,我们定义了一个Database类,它有一个私有静态属性$instance用于存储类的实例,构造函数被声明为私有,以防止外部直接创建新的实例。getInstance方法用于获取类的实例,如果实例不存在,则创建一个新的实例并返回;如果已存在,则直接返回现有实例。getConnection方法用于获取数据库连接。
问题与解答
1、问题:如何修改上述代码以支持不同的数据库配置?
解答: 可以在构造函数中添加参数,以便在创建实例时传递数据库配置信息。
```php

private function __construct($host, $dbname, $username, $password) {
$this>connection = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
}
```
在调用getInstance方法时,可以传递相应的参数:

```php
$database = Database::getInstance('localhost', 'mydb', 'user', 'pass');
```
2、问题:如何在单例模式中处理数据库连接失败的情况?
解答: 可以在构造函数中捕获异常,并在出现错误时抛出自定义异常或提供错误消息。
```php
private function __construct($host, $dbname, $username, $password) {
try {
$this>connection = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
} catch (PDOException $e) {
throw new Exception("Failed to connect to database: " . $e>getMessage());
}
}
```
这样,当尝试创建Database实例时,如果连接失败,将抛出异常,你可以在调用代码中捕获并处理这些异常。