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; }
}
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(); }
}
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
$instance 儲存唯一實例private function __construct() {} 防止外部 new)get() 提供全域存取點SINGLEA、SINGLEB 透過 UTIL::get() 取得同一實例,修改互相影響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];
}
}
支援多重繼承單例,每個子類擁有獨立實例。