PHP中用Trait封裝單例模式的實(shí)現(xiàn)
單例模式的定義
確保某一個(gè)類(lèi)只有一個(gè)實(shí)例,不能重復(fù)實(shí)例,只能它自己實(shí)例化,而且向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。
解決的問(wèn)題
即一個(gè)類(lèi)只被實(shí)例化一次,當(dāng)其他人對(duì)其再次實(shí)例化時(shí),返回第一次實(shí)例化的對(duì)象,可以避免大量的 new 操作,減少資源的消耗。
原則:四步走,三私一公
- 私有化靜態(tài)屬性
- 私有化構(gòu)造方法
- 私有化克隆方法
- 公有化靜態(tài)方法
封裝背景
當(dāng)項(xiàng)目中有多個(gè)單例類(lèi),每新建一個(gè)類(lèi),都得做三私一公的定義,就顯得有些做重復(fù)工作了,不僅僅浪費(fèi)時(shí)間浪費(fèi)精力,而且代碼臃腫且難維護(hù),有沒(méi)有 更優(yōu)雅 的寫(xiě)法呢?
Trait來(lái)封裝單例
php從以前到現(xiàn)在一直都是單繼承的語(yǔ)言,無(wú)法同時(shí)從兩個(gè)基類(lèi)中繼承屬性和方法,為了解決這個(gè)問(wèn)題,php出了Trait這個(gè)特性
用法: 通過(guò)在類(lèi)中使用 use 關(guān)鍵字,聲明要組合的 Trait 名稱(chēng),具體的 Trait 的聲明使用 Trait關(guān)鍵詞,Trait不能被實(shí)例化。
Code示例
創(chuàng)建一個(gè)Trait
<?php
/**
* Trait Singleton 單例模式
*/
Trait Singleton
{
private static $instance = null;
private function __construct()
{
parent::__construct();
// 私有化構(gòu)造方法
}
private function __clone()
{
// 私有化克隆方法
}
public function __sleep()
{
//重寫(xiě)__sleep方法,將返回置空,防止序列化反序列化獲得新的對(duì)象
return [];
}
public static function getInstance()
{
if (!isset(self::$instance)) {
self::$instance = new static();//這里不能new self(),self和static區(qū)別
}
return self::$instance;
}
}
多繼承用法
其他類(lèi)只用在代碼中 use Singleton; ,即可繼承單例了
<?php
/**
* Desc: 業(yè)務(wù)類(lèi)1 繼承實(shí)例
*/
class YieWu1
{
use Singleton; // 關(guān)鍵一行代碼
public function getInfo(){
// 業(yè)務(wù)代碼
}
}
<?php
/**
* Desc: 業(yè)務(wù)類(lèi)2 繼承實(shí)例
*/
class YieWu2
{
use Singleton; // 關(guān)鍵一行代碼
public function getInfo(){
// 業(yè)務(wù)代碼
}
}
實(shí)列調(diào)用
YieWu1::getInstance()->getInfo(); YieWu2::getInstance()->getInfo();
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
php中PDO方式實(shí)現(xiàn)數(shù)據(jù)庫(kù)的增刪改查
PDO是mysql數(shù)據(jù)庫(kù)操作的一個(gè)公用類(lèi)了,我們不需要進(jìn)行自定類(lèi)就可以直接使用pdo來(lái)操作數(shù)據(jù)庫(kù)了,但是在php默認(rèn)配置中pdo是未開(kāi)啟所以我們必須先在php.ini中開(kāi)啟它才可以使用。2015-05-05
TP5框架請(qǐng)求響應(yīng)參數(shù)實(shí)例分析
這篇文章主要介紹了TP5框架請(qǐng)求響應(yīng)參數(shù),結(jié)合實(shí)例形式分析了thinkPHP5請(qǐng)求參數(shù)及相應(yīng)參數(shù)的獲取方法,需要的朋友可以參考下2019-10-10
PHP樹(shù)-不需要遞歸的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇PHP樹(shù)-不需要遞歸的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06
PHP autoload與spl_autoload自動(dòng)加載機(jī)制的深入理解
本篇文章是對(duì)PHP中的autoload與spl_autoload自動(dòng)加載機(jī)制進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
php獲取指定日期之間的各個(gè)周和月的起止時(shí)間
本文推薦給大家一個(gè)php類(lèi)文件,可以根據(jù)指定日期獲取所在周的起始時(shí)間和結(jié)束時(shí)間,并附上使用實(shí)例,有需要的小伙伴參考下吧2014-11-11

