單例模式按字面來看就是指某一個類只存在一個實例,這一點其實是與靜態(tài)方法是相同的,只存在一個實例的好處是當我們需要使用某個類時只需要實例化一次,不需要每次都去new,極大的降低了資源的耗費,比如說數(shù)據(jù)庫的連接類。
一個類只有一個對象實例含義
作為對象的創(chuàng)建模式,單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)全局地提供這個實例。它不會創(chuàng)建實例副本,而是會向單例類內部存儲的實例返回一個引用。
那么單例模式與靜態(tài)方法有什么區(qū)別呢?
個人觀點,如果不存在比較復雜的事務管理,用singleton會比較好,原因有三:
- 1、單例可以繼承類,實現(xiàn)接口,而靜態(tài)類不能(可以集成類,但不能集成實例成員);
- 2、單例可以被延遲初始化,靜態(tài)類一般在第一次加載是初始化;
- 3、單例模式在使用中比靜態(tài)方法更靈活;
雖然這樣說,但到底該選用單例還是靜態(tài),我們還需要視實際情況而定,在設計模式中我們應該做到的是:減少代碼,增加穩(wěn)定,方便理解,提升性能,減少開銷。
扯遠了,下面我們說回PHP中單例模式的使用。
單例類至少擁有以下三種公共元素:
- 1、必須擁有一個構造函數(shù),并且必須被標記為private。
- 2、擁有一個保存類的實例的靜態(tài)成員變量。
- 3、擁有一個訪問這個實例的公共的靜態(tài)方法。
單例模式確保某個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例。
單例模式是一種常見的設計模式,在計算機系統(tǒng)中,線程池、緩存、日志對象、對話框、打印機、數(shù)據(jù)庫操作、顯卡的驅動程序常被設計成單例。
單例模式分3種:懶漢式單例、餓漢式單例、登記式單例。
單例模式有以下3個特點:
1.只能有一個實例。
2.必須自行創(chuàng)建這個實例。
3.必須給其他對象提供這一實例。
那么為什么要使用PHP單例模式?
PHP一個主要應用場合就是應用程序與數(shù)據(jù)庫打交道的場景,在一個應用中會存在大量的數(shù)據(jù)庫操作,針對數(shù)據(jù)庫句柄連接數(shù)據(jù)庫的行為,使用單例模式可以避免大量的new操作。因為每一次new操作都會消耗系統(tǒng)和內存的資源。
具體使用例子:
?php
/**
* by www.jb51.net
*/
class Mysql{
//該屬性用來保存實例
private static $instance;
private $conn;
//構造函數(shù)為private,防止創(chuàng)建對象
private function __construct(){
$this->conn = mysql_connect('localhost','root','123456');
//...
}
//創(chuàng)建一個用來實例化對象的方法
public static function getInstance(){
if(!(self::$instance instanceof self)){
self::$instance = new self;
}
return self::$instance;
}
//防止對象被復制
public function __clone(){
trigger_error('Clone is not allowed !');
}
//...
public function query(){
//do something
}
}
//使用單例調用類中的方法,不能new 和 clone
Mysql::getInstance()->query();
?>
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
您可能感興趣的文章:- PHP實現(xiàn)單例模式建立數(shù)據(jù)庫連接的方法分析
- PHP中用Trait封裝單例模式的實現(xiàn)
- PHP中常用的三種設計模式詳解【單例模式、工廠模式、觀察者模式】
- php Redis函數(shù)用法實例總結【附php連接redis單例類】
- php的單例模式及應用場景詳解