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

PHP 單例模式完整實作與應用場景深度解析

     編輯:PHP 相關知識

PHP 單例模式完整實作與應用場景深度解析

標準實作程式碼

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

    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 is not allowed', E_USER_ERROR);
    }

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

// 錯誤寫法:建構子為 private,無法 new
// $test = new Example;

// 正確取得單例
$test = Example::singleton();
$test->test();

// 複製會觸發錯誤
// $test_clone = clone $test;

單例模式三大核心要素

  1. 某個類別只能有一個實例
  2. 必須自行建立這個實例
  3. 必須自行向整個系統提供這個實例

為什麼 PHP 需要單例模式?

雖然 PHP 每次請求結束會釋放所有記憶體,單例無法跨請求複用,但在單次請求生命週期內仍具價值:

  1. 資料庫連線:避免重複 new PDO 或 mysqli_connect,節省連線開銷
  2. 全域設定管理:如 Zend Framework 的 FrontController,集中管理路由、插件、回應物件
  3. 除錯與日誌:在單例類別內設定 Hook、記錄 SQL、效能分析,避免到處 var_dump

進階寫法:支援繼承的單例基底類別

<?php
abstract class Singleton {
    private static $instances = [];

    protected function __construct() {}
    final public function __clone() {
        trigger_error('Clone not allowed', E_USER_ERROR);
    }
    final public function __wakeup() {
        trigger_error('Unserialize not allowed', E_USER_ERROR);
    }

    public static function getInstance()
    {
        $cls = get_called_class();
        if (!isset(self::$instances[$cls])) {
            self::$instances[$cls] = new $cls();
        }
        return self::$instances[$cls];
    }
}

class Database extends Singleton {
    protected $pdo;
    protected function __construct() {
        $this->pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
    }
    public function getPdo() { return $this->pdo; }
}

// 使用
$db = Database::getInstance();

掌握單例模式能有效控制資源存取,是 PHP 進階開發必備技能。

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