PHP中單例模式的使用場(chǎng)景與使用方法講解
單例模式按字面來(lái)看就是指某一個(gè)類(lèi)只存在一個(gè)實(shí)例,這一點(diǎn)其實(shí)是與靜態(tài)方法是相同的,只存在一個(gè)實(shí)例的好處是當(dāng)我們需要使用某個(gè)類(lèi)時(shí)只需要實(shí)例化一次,不需要每次都去new,極大的降低了資源的耗費(fèi),比如說(shuō)數(shù)據(jù)庫(kù)的連接類(lèi)。
一個(gè)類(lèi)只有一個(gè)對(duì)象實(shí)例含義
作為對(duì)象的創(chuàng)建模式,單例模式確保某一個(gè)類(lèi)只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)全局地提供這個(gè)實(shí)例。它不會(huì)創(chuàng)建實(shí)例副本,而是會(huì)向單例類(lèi)內(nèi)部存儲(chǔ)的實(shí)例返回一個(gè)引用。
那么單例模式與靜態(tài)方法有什么區(qū)別呢?
個(gè)人觀點(diǎn),如果不存在比較復(fù)雜的事務(wù)管理,用singleton會(huì)比較好,原因有三:
- 1、單例可以繼承類(lèi),實(shí)現(xiàn)接口,而靜態(tài)類(lèi)不能(可以集成類(lèi),但不能集成實(shí)例成員);
- 2、單例可以被延遲初始化,靜態(tài)類(lèi)一般在第一次加載是初始化;
- 3、單例模式在使用中比靜態(tài)方法更靈活;
雖然這樣說(shuō),但到底該選用單例還是靜態(tài),我們還需要視實(shí)際情況而定,在設(shè)計(jì)模式中我們應(yīng)該做到的是:減少代碼,增加穩(wěn)定,方便理解,提升性能,減少開(kāi)銷(xiāo)。
扯遠(yuǎn)了,下面我們說(shuō)回PHP中單例模式的使用。
單例類(lèi)至少擁有以下三種公共元素:
- 1、必須擁有一個(gè)構(gòu)造函數(shù),并且必須被標(biāo)記為private。
- 2、擁有一個(gè)保存類(lèi)的實(shí)例的靜態(tài)成員變量。
- 3、擁有一個(gè)訪問(wèn)這個(gè)實(shí)例的公共的靜態(tài)方法。
單例模式確保某個(gè)類(lèi)只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。
單例模式是一種常見(jiàn)的設(shè)計(jì)模式,在計(jì)算機(jī)系統(tǒng)中,線程池、緩存、日志對(duì)象、對(duì)話框、打印機(jī)、數(shù)據(jù)庫(kù)操作、顯卡的驅(qū)動(dòng)程序常被設(shè)計(jì)成單例。
單例模式分3種:懶漢式單例、餓漢式單例、登記式單例。
單例模式有以下3個(gè)特點(diǎn):
1.只能有一個(gè)實(shí)例。
2.必須自行創(chuàng)建這個(gè)實(shí)例。
3.必須給其他對(duì)象提供這一實(shí)例。
那么為什么要使用PHP單例模式?
PHP一個(gè)主要應(yīng)用場(chǎng)合就是應(yīng)用程序與數(shù)據(jù)庫(kù)打交道的場(chǎng)景,在一個(gè)應(yīng)用中會(huì)存在大量的數(shù)據(jù)庫(kù)操作,針對(duì)數(shù)據(jù)庫(kù)句柄連接數(shù)據(jù)庫(kù)的行為,使用單例模式可以避免大量的new操作。因?yàn)槊恳淮蝞ew操作都會(huì)消耗系統(tǒng)和內(nèi)存的資源。
具體使用例子:
<?php
/**
* by www.dhdzp.com
*/
class Mysql{
//該屬性用來(lái)保存實(shí)例
private static $instance;
private $conn;
//構(gòu)造函數(shù)為private,防止創(chuàng)建對(duì)象
private function __construct(){
$this->conn = mysql_connect('localhost','root','123456');
//...
}
//創(chuàng)建一個(gè)用來(lái)實(shí)例化對(duì)象的方法
public static function getInstance(){
if(!(self::$instance instanceof self)){
self::$instance = new self;
}
return self::$instance;
}
//防止對(duì)象被復(fù)制
public function __clone(){
trigger_error('Clone is not allowed !');
}
//...
public function query(){
//do something
}
}
//使用單例調(diào)用類(lèi)中的方法,不能new 和 clone
Mysql::getInstance()->query();
?>
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- 一文帶你搞懂PHP單例模式
- php的單例模式及應(yīng)用場(chǎng)景詳解
- PHP實(shí)現(xiàn)單例模式建立數(shù)據(jù)庫(kù)連接的方法分析
- PHP設(shè)計(jì)模式之單例模式入門(mén)與應(yīng)用詳解
- php設(shè)計(jì)模式之單例模式用法經(jīng)典示例分析
- PHP單例模式實(shí)例分析【防繼承,防克隆操作】
- PHP設(shè)計(jì)模式之單例模式定義與用法分析
- PHP單例模式數(shù)據(jù)庫(kù)連接類(lèi)與頁(yè)面靜態(tài)化實(shí)現(xiàn)方法
- PHP單例模式Singleton Pattern的原理與實(shí)現(xiàn)介紹
相關(guān)文章
PHP中sleep()函數(shù)的實(shí)用場(chǎng)景以及注意事項(xiàng)
sleep()函數(shù)是PHP中的一個(gè)休眠函數(shù),可以讓程序在指定的時(shí)間內(nèi)暫停執(zhí)行,以達(dá)到延遲執(zhí)行的效果,本文介紹使用sleep()函數(shù)的實(shí)用場(chǎng)景以及注意事項(xiàng)2023-09-09
Linux下安裝oracle客戶(hù)端并配置php5.3
這篇文章主要介紹了Linux下安裝oracle客戶(hù)端并配置php5.3,需要的朋友可以參考下2014-10-10
PHP number_format函數(shù)原理及實(shí)例解析
這篇文章主要介紹了PHP number_format函數(shù)原理及實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Ajax+PHP快速上手及簡(jiǎn)單應(yīng)用說(shuō)明
對(duì)于Ajax,最核心的一個(gè)對(duì)象是XMLHttpRequest,所有的Ajax操作都離不開(kāi)對(duì)這個(gè)對(duì)象的操作2013-07-07
PHP利用遞歸函數(shù)實(shí)現(xiàn)無(wú)限級(jí)分類(lèi)的方法
今天小編就為大家分享一篇關(guān)于PHP利用遞歸函數(shù)實(shí)現(xiàn)無(wú)限級(jí)分類(lèi)的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03
php中簡(jiǎn)單的對(duì)稱(chēng)加密算法實(shí)現(xiàn)
最近突發(fā)奇想要往數(shù)據(jù)庫(kù)里保存一些機(jī)密的東西,然后就想著怎么讓別人即使進(jìn)入到了數(shù)據(jù)庫(kù)也看不懂存儲(chǔ)的是什么,那么只有加密了;可是我們自己還要看呢,那只能找一些對(duì)稱(chēng)加密的算法了,我們想看的時(shí)候再解密回來(lái)。下面就介紹了php中簡(jiǎn)單的對(duì)稱(chēng)加密算法實(shí)現(xiàn)。2017-01-01
PHP中運(yùn)用jQuery的Ajax跨域調(diào)用實(shí)現(xiàn)代碼
PHP中運(yùn)用jQuery的Ajax跨域調(diào)用實(shí)現(xiàn)代碼,需要的朋友可以參考下2012-02-02

