1. 單例模式含義
單例模式就是一個類只有一個實例,不能外部實例化壳猜,并向整個系統(tǒng)全局地提供這個實例。它不會創(chuàng)建實例副本滑凉,而是會向單例類內(nèi)部存儲的實例返回一個引用统扳。
2. 為何要使用PHP單例模式?
PHP每次執(zhí)行完,返回數(shù)據(jù)后,會從內(nèi)存中清理掉所有的資源. 所以PHP中的單例模式實際每次運行都是需重新實例化, php單例模式適合使用在整個運行過程中需要多次對某一操作類進行多次new的場景畅姊。
注: 每實例化一次就會在堆內(nèi)存中復制一份代碼段
<?php
class {
function __consruct(){
}
}
$Aobj = new A();
$Bobj = new A();
if($Aobj === $Bobj){
echo '對象相等','<br>';
}else{
echo '對象不相等','<br>';
}
echo '<pre>';
var_dump($Aobj);
var_dump($Bobj);
打印如下輸出
3. 創(chuàng)建一個PHP單例其實只需要掌握以下四點:
- 定義靜態(tài)變量咒钟,存放該類實例化的唯一對象
- 定義私有構(gòu)造方法,防止類外部new創(chuàng)建對象
- 定義公共的靜態(tài)方法來獲取該對象,供類外部使用
- 定義個私有的克隆方法若未,禁止該對象被克隆
注: php的static變量只針對一次請求朱嘴,php文件執(zhí)行完畢,該static變量也隨機消亡粗合,再次請求(再次執(zhí)行該php文件)萍嬉,會重新創(chuàng)建該static變量。
4. 單例模式使用場景:
- 數(shù)據(jù)庫應用, 一個應用中會頻繁進行數(shù)據(jù)庫操作, 如使用單例模式, 則可以避免大量的new 操作,避免過多的消耗系統(tǒng)資源隙疚。
- 配置資源的共享壤追,用單例模式也可以減少每次去讀取配置帶來的內(nèi)存和系統(tǒng)資源的消耗
- 可以在單例模式類中,集中處理,設置鉤子,日志輸出等提高代碼可維護性
5. 使用示例
5.1. redis使用示例
<?php
class RedisModel{
# 私有靜態(tài) 變量存儲被實例化的對象
private static $obj=null;
#禁止外部實例化
private function __construct(){
self::$obj = new \Redis();
self::$obj->connect('127.0.0.1','6379');
}
#外部調(diào)用創(chuàng)建該類的實例
public static function create(){
if(self::$obj === null) new RedisModel();
return self::$obj;
}
# 禁止克隆該對象
private function __clone(){}
}
$redisModelA = RedisModel::create();
$redisModelB = RedisModel::create();
if($redisModelB ===$redisModelA){
echo '相等','<br>';
}else{
echo '不相等','<br>';
}
$redisModelB->set('name','張三');
echo $redisModelB->get('name');
# 2. 報錯說明已經(jīng)禁止外部實例
$redisModelC = new RedisModel();
var_dump($redisModelC);