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

PHP 設計模式:單例模式詳解與實戰範例

     編輯:PHP 綜合知識

單例模式核心概念

單例模式確保一個類別在全域只有唯一實例,並提供全域存取點。適用於資源共享場景(如資料庫連線、日誌記錄器、配置管理)。

核心實作要素

  1. 私有靜態屬性 保存唯一實例(private static $instance = null;)。
  2. 私有建構子 防止外部 new 建立實例。
  3. 公開靜態方法(通常命名 getInstance())回傳唯一實例,首次呼叫時建立。

實戰範例:小船載人

<?php
class Boat {
    private static $instance = null;
    private $skipper;
    private $personNum = 0;
    private $passengers = array();

    private function __construct() {}

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

    public function setSkipper($name) {
        $this->skipper = $name;
    }

    public function load($person) {
        if (!empty($person) && $this->personNum < 5) {
            array_push($this->passengers, $person);
            $this->personNum++;
        } elseif ($this->personNum >= 5) {
            echo 'This boat only loads 5 persons!';
        }
    }

    public function whoInBoat() {
        return $this->passengers;
    }
}
?>

使用示範

<?php
include 'boat.php';

echo "從前有一條河,河裡只有一條船,<br>";
$boat1 = Boat::getInstance(); // 取得唯一實例
echo "現在張三要到河東去,";
$boat1->load('張三');
echo "<br>現在船上坐著:<br>";
foreach ($boat1->whoInBoat() as $who) {
    echo $who . '<br>';
}

echo "<br>現在李四也要過河東去<br>";
$boat1->load('李四');
echo "現在船上坐著:<br>";
foreach ($boat1->whoInBoat() as $who) {
    echo $who . '、';
}

echo "<br><br>王五以為這條河有另一條船,<br>";
$boat2 = Boat::getInstance(); // 仍取得同一實例
echo "他現在上船<br>";
$boat2->load('王五');
echo "現在船上坐著:<br>";
foreach ($boat1->whoInBoat() as $who) {
    echo $who . '、';
}
// 輸出:張三、李四、王五、 — 證明 $boat1 與 $boat2 為同一物件
?>

進階:防止複製與反序列化破壞單例

private function __clone() {}
public function __wakeup() {
    if (self::$instance !== null) {
        return self::$instance;
    }
}

適用場景與注意事項

  • 資料庫連線池、快取物件、日誌記錄器、配置管理類。
  • 單例會增加全域狀態,單元測試時需注意依賴注入或提供重置方法。
  • PHP 中單例僅在單次請求生命週期內有效,跨請求不共享。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved