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

PHP 單例模式實作範例:跨多個類別共享同一資源實例

     編輯:PHP 綜合知識

單例核心類別

class UTIL {
    private static $instance;
    public $number = 10;

    public static function get() {
        if (!self::$instance) {
            self::$instance = new UTIL();
        }
        return self::$instance;
    }

    public function change($num) { $this->number += $num; }
    public function getNum() { return $this->number; }
}

使用單例的應用類別 A

class SINGLEA {
    private $numInst;
    public function __construct() {
        $this->numInst = UTIL::get();
    }
    public function change($num) { $this->numInst->change($num); }
    public function getNum() { return $this->numInst->getNum(); }
}

使用單例的應用類別 B

class SINGLEB {
    private $numInst;
    public function __construct() {
        $this->numInst = UTIL::get();
    }
    public function change($num) { $this->numInst->change($num); }
    public function getNum() { return $this->numInst->getNum(); }
}

實際執行與輸出

$instA = new SINGLEA();
$instA->change(100);
var_dump('SINGLEA CHANGED: ');
var_dump($instA->getNum()); // int 110

$instB = new SINGLEB();
$instB->change(-510);
var_dump('SINGLEB CHANGED: ');
var_dump($instB->getNum()); // int -400

關鍵點解析

  1. 私有靜態屬性 $instance 儲存唯一實例
  2. 私有建構子(此處省略,可加上 private function __construct() {} 防止外部 new)
  3. 公開靜態方法 get() 提供全域存取點
  4. 多個類別共享:SINGLEA、SINGLEB 透過 UTIL::get() 取得同一實例,修改互相影響

應用場景

  • 資料庫連線池
  • 配置管理器
  • 日誌記錄器
  • 快取管理器

PHP 5.3+ 寫法優化

class Singleton {
    private static $instances = [];
    protected function __construct() {}
    private function __clone() {}
    public function __wakeup() {}

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

支援多重繼承單例,每個子類擁有獨立實例。

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