確保一個類別只有一個實例,並提供全域存取點。
<?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():全域存取點,延遲初始化。| 優點 | 缺點 |
|---|---|
| 受控存取唯一實例 | 隱藏依賴關係,難以單元測試(需用容器注入替代) |
| 命名空間不受污染 | 違反單一職責(同時負責業務邏輯與生命週期管理) |
| 延遲初始化 | 全域狀態導致測試隔離困難 |