在 PHP 中,要優(yōu)雅地實(shí)現(xiàn)單例模式,可以使用以下代碼:
class Singleton {
private static $instance;
private function __construct() {}
public static function getInstance(): Singleton {
if (null === self::$instance) {
self::$instance = new Singleton();
}
return self::$instance;
}
private function __clone() {}
private function __wakeup() {}
}
這個實(shí)現(xiàn)方法包含以下特點(diǎn):
private function __construct()
),這樣就無法從類外部實(shí)例化新對象。getInstance()
,用于獲取單例實(shí)例。getInstance()
被調(diào)用時,會檢查 $instance
是否為 null
。如果是,則創(chuàng)建一個新的 Singleton
實(shí)例;否則,返回已存在的實(shí)例。__clone()
和 __wakeup()
方法也設(shè)置為私有,以防止通過克隆或反序列化創(chuàng)建新的實(shí)例。使用這個單例類的方法如下:
$singleton1 = Singleton::getInstance();
$singleton2 = Singleton::getInstance();
if ($singleton1 === $singleton2) {
echo "兩個對象是相同的實(shí)例。";
} else {
echo "兩個對象不是相同的實(shí)例。";
}
這段代碼將輸出 “兩個對象是相同的實(shí)例?!?,因?yàn)槲覀兺ㄟ^ Singleton::getInstance()
獲取的兩個對象都是同一個實(shí)例。