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

PHP 單例模式實作範例

     編輯:PHP 綜合知識

單例模式確保類別全域只有一個實例,並提供全域存取點。適用於資料庫連線、設定管理、日誌記錄器等共享資源。

標準實作 (PHP 5.3+)

<?php
class Singleton {
    private static ?self $instance = null;
    private string $name = '';

    private function __construct() {}
    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 setName(string $name): void { $this->name = $name; }
    public function getName(): string { return $this->name; }
}

// 使用
$s = Singleton::getInstance();
$s->setName('first');
echo '$s: ' . $s->getName() . "\n"; // first

unset($s); // 變數銷毀,實例仍在靜態屬性中

$m = Singleton::getInstance();
echo '$m: ' . $m->getName() . "\n"; // first (同一實例)
?>

關鍵要素

  • private __construct:防止外部 new
  • private __clone:防止 clone
  • __wakeup:防止反序列化建立新實例
  • static $instance:儲存唯一實例
  • static getInstance():全域存取點

現代寫法:readonly + 惰性初始化 (PHP 8.1+)

final class Singleton {
    private static ?self $instance = null;
    public readonly string $createdAt;

    private function __construct() {
        $this->createdAt = (new DateTime())->format('c');
    }

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

反模式與爭議

  • 全域狀態:難以測試、隱性耦合
  • 違反單一職責:類別同時管理實例控制與業務邏輯
  • 依賴注入 (DI) 容器可替代單例,生命週期由容器管理

適用場景

  • 舊專案無 DI 容器時的資源共享
  • 第三方 SDK 要求單例
  • 簡易工具類 (Logger, Config)

理解單例優缺點,現代專案優先考慮 DI 容器管理共享服務。

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