您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)PHP單例模式有什么用的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
具體如下:
先簡(jiǎn)單的介紹一下單例模式。單例模式就是在應(yīng)用程序中保持某一個(gè)類實(shí)例只存在一個(gè),而且不可以受外部環(huán)境的影響而生成這個(gè)類的第二個(gè)實(shí)例。它的優(yōu)點(diǎn),實(shí)際點(diǎn)見(jiàn),如果在WEB開(kāi)發(fā)中,保持單一個(gè)數(shù)據(jù)操作類實(shí)例的存在,可以減少不必要的多余連接數(shù)據(jù)庫(kù)資源的消耗,對(duì)于大型的軟件開(kāi)發(fā)來(lái)說(shuō),可以使用單例來(lái)維持程序的狀態(tài),使不同操作實(shí)現(xiàn)同步,因?yàn)閱卫恢闭紦?jù)內(nèi)存,而從不會(huì)有副本。
而對(duì)于PHP,使用單例最常用的場(chǎng)合莫過(guò)于寫一個(gè)數(shù)據(jù)庫(kù)操作類。不過(guò)在PHP中實(shí)現(xiàn)單例,有以下規(guī)則:
1)單例類必須擁有一個(gè)現(xiàn)式聲明的構(gòu)造函數(shù),并且是私有的。
2)單例類必須有一個(gè)靜態(tài)變量來(lái)存儲(chǔ)類的實(shí)例,這樣可以保持這個(gè)單例類就只有那么一個(gè)實(shí)例。
3)單例類必須提供一個(gè)靜態(tài)方法,供其他所有的對(duì)象應(yīng)用這個(gè)單例。
為什么要滿足以上三個(gè)條件呢:
1)因?yàn)閱卫愒谡麄€(gè)應(yīng)用程序運(yùn)行時(shí),只能被創(chuàng)造一次,而且這種創(chuàng)造是不是通過(guò)外部調(diào)用而完成,而是自身完成。所以單例類是自己實(shí)例化自己,所以其構(gòu)造函數(shù)必須是私有。任何其他外部對(duì)象都不可以再次構(gòu)造一個(gè)單例類的副本。
2)因?yàn)閱卫愔荒軌蜃约簩?shí)例化自己,而又要為所有外部應(yīng)用提供自己的實(shí)例,所以類內(nèi)部必須有一個(gè)可供外界訪問(wèn),而又是唯一不變的訪問(wèn)存儲(chǔ)對(duì)象點(diǎn),所以要提供一個(gè)靜態(tài)變量去存儲(chǔ)單例類自己實(shí)例化自己的那個(gè)實(shí)例對(duì)象。
3)因?yàn)閱卫惖臉?gòu)造函數(shù)是私有的,所以單例類必須提供一個(gè)外部接口供外部環(huán)境調(diào)用單例類,所以必須有一個(gè)靜態(tài)方法,它可以初始化單例類或者返回單例類的對(duì)象的引用。
一個(gè)簡(jiǎn)單的例子:
class DB{ private $_link; // 保持單例類的靜態(tài)變量 static $_instance; // 私有的構(gòu)造函數(shù) private function __construct(){ $this->_link = @mysqli_connect(__HOST__, __USER__, __PASSWORD__, __DATABASE__); if(! ($this->_link)){ echo 'Something wrong occurs on the database connection!'; } } // 防止單例類被克隆 private function __clone(){} // 外界訪問(wèn)單例類實(shí)例的接口 public static function getInstance(){ if(! (self::$_instance instanceof self)){ self::$_instance = new self(); } return self::$_instance; } }
注意,以上定義的一個(gè) __clone() 函數(shù),防止單例類對(duì)象被克隆。
以下也是一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)操作類的單例,供參考:
class DB { /** * the database connection * @var resource * @access private */ private $_link; /** * the static instance of single db * @var object * @access static */ static $_instance; /** * construct the single object * @return null * @access private */ private function __construct(){ $this->_link = @mysqli_connect(__HOST__, __USER__, __PASSWORD__, __DATABASE__); if(! ($this->_link)){ echo 'Something wrong occurs on the database connection!'; } } /** * empty clone * @return null * @access private */ private function __clone(){} /** * for other object to get the instance of db * @return self::instance * @access public */ public static function getInstance(){ if(! (self::$_instance instanceof self)){ self::$_instance = new self(); } return self::$_instance; } /** * query * @param sql string * @param message string * @return resource * @access public */ public function query($sql,$message){ $result = @mysqli_query($this->$_link, $sql) or die($message . mysqli_error($this->$_link)); return $result; } /** * mysqli_num_rows * @param result resource * @return int * @access public */ public function num($result){ return @mysqli_num_rows($result); } /** * mysqli_fetch_array * @param result resource * @return array * @access public */ public function fetchArr($result){ return @mysqli_fetch_array($result); } /** * mysqli_insert_id * @return int * @access public */ public function last_id(){ return @mysqli_insert_id($this->_link); } /** * close the database connection * @param result resource * @return null * @access public */ public function close(){ @mysqli_close($this->_link); } /** * fetch once result from the specific sql query * @param sql string * @param message string * @return array * @access public */ public function fetchArrOnce($sql, $message){ $result = $this->query($sql, $message); $row = $this->fetchArr($result); return $row; } /** * fetch all results from the specific sql query * @param sql string * @param message string * @return array * @access public */ public function fetchArrMore($sql, $message){ $result = $this->query($sql, $message); $moreRow = array(); while($row = $this->fetchArr($result)){ $moreRow[] = $row; } return $moreRow; } /** * fetch the number of results from the specific sql query * @param sql string * @param message string * @return array * @access public */ public function fetchNum($sql, $message){ $result = $this->query($sql, $message); $resultNum = $this->num($result); return $resultNum; } /** * mysqli_prepare * @param sql string * @return stmt object * @access public */ public function prepare($sql){ return @mysqli_prepare($this->_link, $sql); } /** * mysqli_stmt_execute * @param stmt object * @param message string * @return bool * @access public */ public function stmt_execute($stmt, $message){ @mysqli_stmt_execute($stmt) or die($message . mysqli_error($this->_link)); } }
使用:
define("__HOST__", "localhost"); define("__USER__", "root"); define("__PASSWORD__", ""); define("__DATABASE__", "eee"); $db = DB::getInstance();
感謝各位的閱讀!關(guān)于“PHP單例模式有什么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。