首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 設計模式實戰:單例模式完整實作與原理深度解析

     編輯:PHP 相關知識

單例模式確保一個類別在全域僅有一個實例,並提供全域存取點。常用於資料庫連線、配置管理、日誌記錄器等場景。本文從核心程式碼到原理逐層拆解。

標準單例實作

<?php
final class Database {
    private static ?self $instance = null;

    // 私有建構子,防止外部 new
    private function __construct() {
        // 實際連線邏輯:PDO、mysqli 等
    }

    // 禁止克隆
    private function __clone() {}

    // 禁止反序列化
    public function __wakeup() {
        throw new \Exception("Cannot unserialize singleton");
    }

    public static function getInstance(): self {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    // 業務方法範例
    public function query(string $sql): array {
        // ...
        return [];
    }
}

// 使用方式
$db = Database::getInstance();
$db->query('SELECT 1');
?>

關鍵點逐行解析

  1. final class:防止繼承破壞單例(子類別可建立多實例)。
  2. private static $instance:靜態屬性儲存唯一實例,屬於類別而非物件。
  3. private __construct():封鎖 new Database()。
  4. private __clone():封鎖 clone $db。
  5. __wakeup():防止 unserialize() 重建實例。
  6. getInstance():延遲初始化,首次呼叫才建立實例,後續直接回傳。

進階:執行緒安全與依賴注入

PHP 單執行緒模型下上述寫法足夠。若使用 Swoole/RoadRunner 等多執行緒環境,需加入鎖機制:

public static function getInstance(): self {
    if (self::$instance === null) {
        $lock = Lock::acquire('db_singleton');
        if (self::$instance === null) { // Double-check
            self::$instance = new self();
        }
        $lock->release();
    }
    return self::$instance;
}

現代框架(Laravel、Symfony)傾向用服務容器管理單例生命週期,而非硬編碼單例類別,便於測試與解耦。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved