單例模式確保一個類別在全域只有唯一實例,並提供全域存取點。適用於資源共享場景(如資料庫連線、日誌記錄器、配置管理)。
private static $instance = null;)。new 建立實例。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;
}
}