單例模式的定義
確保某一個類只有一個實(shí)例,不能重復(fù)實(shí)例,只能它自己實(shí)例化,而且向整個系統(tǒng)提供這個實(shí)例。
解決的問題
即一個類只被實(shí)例化一次,當(dāng)其他人對其再次實(shí)例化時,返回第一次實(shí)例化的對象,可以避免大量的 new 操作,減少資源的消耗。
原則:四步走,三私一公
- 私有化靜態(tài)屬性
- 私有化構(gòu)造方法
- 私有化克隆方法
- 公有化靜態(tài)方法
封裝背景
當(dāng)項(xiàng)目中有多個單例類,每新建一個類,都得做三私一公的定義,就顯得有些做重復(fù)工作了,不僅僅浪費(fèi)時間浪費(fèi)精力,而且代碼臃腫且難維護(hù),有沒有 更優(yōu)雅 的寫法呢?
Trait來封裝單例
php從以前到現(xiàn)在一直都是單繼承的語言,無法同時從兩個基類中繼承屬性和方法,為了解決這個問題,php出了Trait這個特性
用法: 通過在類中使用 use 關(guān)鍵字,聲明要組合的 Trait 名稱,具體的 Trait 的聲明使用 Trait關(guān)鍵詞,Trait不能被實(shí)例化。
Code示例
創(chuàng)建一個Trait
?php
/**
* Trait Singleton 單例模式
*/
Trait Singleton
{
private static $instance = null;
private function __construct()
{
parent::__construct();
// 私有化構(gòu)造方法
}
private function __clone()
{
// 私有化克隆方法
}
public function __sleep()
{
//重寫__sleep方法,將返回置空,防止序列化反序列化獲得新的對象
return [];
}
public static function getInstance()
{
if (!isset(self::$instance)) {
self::$instance = new static();//這里不能new self(),self和static區(qū)別
}
return self::$instance;
}
}
多繼承用法
其他類只用在代碼中 use Singleton; ,即可繼承單例了
?php
/**
* Desc: 業(yè)務(wù)類1 繼承實(shí)例
*/
class YieWu1
{
use Singleton; // 關(guān)鍵一行代碼
public function getInfo(){
// 業(yè)務(wù)代碼
}
}
?php
/**
* Desc: 業(yè)務(wù)類2 繼承實(shí)例
*/
class YieWu2
{
use Singleton; // 關(guān)鍵一行代碼
public function getInfo(){
// 業(yè)務(wù)代碼
}
}
實(shí)列調(diào)用
YieWu1::getInstance()->getInfo();
YieWu2::getInstance()->getInfo();
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:- PHP實(shí)現(xiàn)單例模式建立數(shù)據(jù)庫連接的方法分析
- PHP中常用的三種設(shè)計(jì)模式詳解【單例模式、工廠模式、觀察者模式】
- PHP中單例模式的使用場景與使用方法講解
- php Redis函數(shù)用法實(shí)例總結(jié)【附php連接redis單例類】
- php的單例模式及應(yīng)用場景詳解