PHP設計模式之單例模式
單例模式在設計模式中是屬於建立型的型別
單例模式可以使一個程式處理請求過程中,只建立一次,減少類的頻繁例項化
單例模式不可以在外部例項化,也就是構造方法要設定為私有的方法
單例模式只需要向外部提供一個公開的靜態方法介面,給外部呼叫者使用
單例模式要提供一個私有的克隆方法,防止外部克隆產生一個新的副本
單例模式需要提供一個私有的防止類序列化的方法,以免產生一個新的副本
單例模式可以分類餓漢式和飽漢式等等,在這裡我們就提供一個餓漢式的單例模式
單例模式一般可以用於資料層的連線(資料庫的連線)
可以把單例模式建立的類設定為
final
,就是這是一個最終的類,不許繼承,不許修改具體PHP實現單例模式如下:
final class DbConnect
{
private static $instance = null;
/**
* 防止外部例項化
* DbConnect constructor.
*/
private function __construct()
{
try {
$dsn = 'mysql:dbname=test;host=127.0.0.1;port=3306';
$username = 'root';
$password = 'root';
static::$instance = new \PDO($dsn, $username, $password);
} catch (\PDOException $e) {
die('PDO connect is error!' . $e->getMessage());
} catch (\Exception $e) {
var_dump($e->getMessage());
}
}
/**
* Notes: 防止克隆產生一個副本
* Name: __clone
* User: LiYi
* Date: 2020/6/14
* Time: 12:04
*/
private function __clone()
{
// TODO: Implement __clone() method.
}
/**
* Notes:防止序列化產生副本
* Name: __wakeup
* User: LiYi
* Date: 2020/6/14
* Time: 12:04
*/
private function __wakeup()
{
}
/**
* Notes:對外提供的一個唯一的訪問介面
* Name: getInstance
* User: LiYi
* Date: 2020/6/14
* Time: 12:05
*/
public static function getInstance()
{
//單例模式有餓漢式和飽漢式之分
//餓漢式就是例項化這個類的時候,先判斷是否建立,沒有建立才去例項化
//飽漢式就是進來就先建立,然後返回
//在PHP中,一般的執行環境都是LNPM,安裝PHP的時候也是一般安裝的是執行緒安全的版本,沒有多執行緒,一般都是一個請求進來,就是一個程式,所
//以同一個請求就是一個程式,對開發來說這個很簡單,不需要去考慮執行緒安全與否,那麼我們在建立的時候,就在這裡使用餓漢式
if (null === static::$instance) {
new self();
}
return static::$instance;
}
}
- 測試程式碼如下:
class Client
{
public function __construct()
{
$test1 = DbConnect::getInstance();
$sql = "SELECT user,host FROM mysql.user WHERE user = :user";
$statement = $test1->prepare($sql);
$username = 'root';
$statement->bindParam(':user', $username);
$statement->execute();
$users = $statement->fetchAll();
print_r($users);
var_dump(($test1->query('SELECT user,host FROM mysql.user;'))->fetchAll());
}
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結
LIYi ---- github地址