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

PHP 單例模式簡易實作與核心概念解析

     編輯:PHP 綜合知識

單例模式定義

確保類別在系統中只有一個實例,並提供全域存取點。三要素:唯一實例、自行建立、全域提供。

標準實作碼

class Example {
    private static $_instance = null;

    // 私有建構子,防外部 new
    private function __construct() {
        echo 'I am Constructed';
    }

    // 靜態方法取得實例
    public static function singleton() {
        if (!isset(self::$_instance)) {
            $c = __CLASS__;
            self::$_instance = new $c();
        }
        return self::$_instance;
    }

    // 防止克隆
    public function __clone() {
        trigger_error('Clone not allowed', E_USER_ERROR);
    }

    public function test() {
        echo "test";
    }
}

// 使用
$obj = Example::singleton(); // 正確
$obj->test();

// 錯誤示範
// $obj = new Example; // Fatal: 建構子私有
// $clone = clone $obj;  // E_USER_ERROR

關鍵點解析

要素實作方式目的
靜態私有屬性private static $_instance儲存唯一實例
私有建構子private __construct()阻擋 new Example()
私有克隆private __clone()阻擋 clone $obj
公開靜態方法public static singleton()唯一取得實例管道
::__CLASS__動態取得類別名支援繼承時正確實例化

為什麼 PHP 需要單例?

  • 資源複用: 資料庫連線、Redis 連線、配置物件,避免重複建立消耗
  • 全域管理: 統一存取點,便於加入日誌、監控、除錯鉤子
  • 狀態共享: 請求週期內跨模組共享狀態(如購物車、用戶身份)

PHP 特有限制

PHP 採用 Share-Nothing 架構,每個請求獨立進程,請求結束記憶體完全釋放。
因此 PHP 單例不跨請求持久化,僅在單次請求內保證唯一。

現代替代方案

  • 依賴注入容器: 註冊為 shared/service,由容器管理生命週期
  • 靜態工廠方法: 類似單例但更易測試、可替換實作
  • Service Locator(慎用): 全域服務查找器

理解單例本質,並在適當場景使用,避免濫用造成強耦合。

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