單例模式是一種創建型設計模式,其核心目的是確保某個類在整個應用程序生命周期中只存在一個實例,並提供一個全局訪問點來獲取該實例。這在資源共享場景(如數據庫連接、配置管理、日誌記錄器)中極為常見。
單例模式通過三個關鍵要素實現:
new 關鍵字實例化以下代碼摘自 InitPHP 框架核心加載類,展示了單例模式在類加載機制中的實際應用:
/**
* 框架核心加載器 - 採用單例模式管理類實例
* 支持加載 Controller、Service、View、Dao、Util、Library 等層級類
* 使用方式:$this->load($class_name, $type)
*/
public function load($class_name, $type) {
// 1. 解析類文件路徑與類名
$class_path = $this->get_class_path($class_name, $type);
$class_name = $this->get_class_name($class_name);
// 2. 文件存在性檢查
if (!file_exists($class_path)) {
InitPHP::initError('file ' . $class_name . '.php is not exist!');
}
// 3. 單例核心邏輯:檢查靜態容器中是否已存在實例
if (!isset(self::$instance['initphp'][$class_name])) {
require_once($class_path);
// 4. 類存在性二次驗證
if (!class_exists($class_name)) {
InitPHP::initError('class ' . $class_name . ' is not exist!');
}
// 5. 實例化並存入靜態容器
$init_class = new $class_name();
self::$instance['initphp'][$class_name] = $init_class;
}
// 6. 返回唯一實例
return self::$instance['initphp'][$class_name];
}
self::$instance['initphp'][$class_name] 採用二維數組結構,第一維區分模塊(如 initphp、user 等),第二維存儲具體類實例,實現了模塊級的單例隔離。
file_exists 防止引入不存在文件class_exists 防止文件存在但類定義缺失實例只有在首次被請求時才會創建,符合「按需加載」原則,避免不必要的資源佔用。
PHP 運行於單線程模型(傳統 FPM 模式),單例模式天然線程安全。但在 Swoole、Workerman 等常駐內存框架中,需注意:
::getInstance()destroyInstance() 方法供測試或特殊場景重置單例模式通過「私有構造 + 靜態容器 + 公有訪問」三板斧,優雅地解決了全局唯一實例需求。InitPHP 框架的加載器實現展示了其在實際項目中的工程化應用:結合路徑解析、存在性驗證、惰性初始化,構建了健壯的類加載體系。理解其核心邏輯與適用邊界,能幫助開發者在架構設計中做出更合理的決策。