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

PHP 設計模式:單例模式 實作範例

     編輯:PHP 綜合知識

模式定義

確保一個類別只有一個實例,並提供全域存取點。

程式碼實作

<?php
class Singleton {
    private static $_instance = null;

    // 私有建構子,防止外部 new
    private function __construct() {}

    // 私有克隆,防止 clone
    private function __clone() {}

    // 私有反序列化,防止 unserialize
    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 display() {
        echo "This is a singleton method
"; } } /* 使用範例 */ $obj = Singleton::getInstance(); $obj->display(); $obj1 = Singleton::getInstance(); var_dump($obj === $obj1); // true,同一實例

關鍵要素

  • private static $_instance:靜態保存唯一實例。
  • private __construct():禁止外部實例化。
  • private __clone()、__wakeup():防止複製與反序列化破壞單例。
  • static getInstance():全域存取點,延遲初始化。

常見變體

  • 雙重檢查鎖定:多執行緒環境下(PHP 通常單執行緒,較少用)。
  • 登記式單例:容器管理多個單例服務(如 Laravel Service Container)。

優缺點

優點缺點
受控存取唯一實例隱藏依賴關係,難以單元測試(需用容器注入替代)
命名空間不受污染違反單一職責(同時負責業務邏輯與生命週期管理)
延遲初始化全域狀態導致測試隔離困難

最佳實務建議

  • 優先使用依賴注入容器管理共享服務生命週期,而非硬編碼單例。
  • 若必須用單例,提供介面並對介面編程,便於測試時替換 Mock。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved