国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - 雞肋的PHP單例模式應(yīng)用詳解

雞肋的PHP單例模式應(yīng)用詳解

2020-03-28 12:24PHP教程網(wǎng) PHP教程

本篇文章是對php單例模式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下

單例模式的要點(diǎn)有三個:
一是某個類只能有一個實(shí)例;
二是它必須自行創(chuàng)建這個實(shí)例;
三是它必須自行向整個系統(tǒng)提供這個實(shí)例。

復(fù)制代碼 代碼如下:


<?php
/* 單例模式舉例,其要點(diǎn)如下:
*
* 1. $_instance 必須聲明為靜態(tài)的私有變量
* 2. 構(gòu)造函數(shù)和克隆函數(shù)必須聲明為私有的,這是為了防止外部程序 new 類從而失去單例模式的意義
* 3. getInstance()方法必須聲明為公有的,必須調(diào)用此方法以返回唯一實(shí)例的一個引用
* 4. ::操作符只能訪問靜態(tài)變量或靜態(tài)函數(shù)
* 5. PHP的單例模式是相對而言的,因?yàn)镻HP的解釋運(yùn)行機(jī)制使得每個PHP頁面被解釋執(zhí)行后,所有的相關(guān)資源都會被回收。

* 也就是說,PHP在語言級別上沒有辦法讓某個對象常駐內(nèi)存。在PHP中,所有的變量都是頁面級的,無論是全局變量,
* 還是類的靜態(tài)成員,都會在頁面執(zhí)行完畢后被清空,結(jié)果會重新建立新的對象,這樣也就完全失去了Singleton的意義。
* 不過,在實(shí)際應(yīng)用中同一個頁面中可能會存在多個業(yè)務(wù)邏輯,這時單例模式就起到了很重要的作用,有效的避免了重復(fù)
* new 對象(注: new 對象會消耗內(nèi)存資源)這么一個行為,所以我們說PHP的單例模式是相對而言的
*
*/
class People
{
static private $_instance = NULL;
public $height = '';
public $age = '';
private function __construct()
{
$this->height = '185';
$this->age = 25;
}
private function __clone()
{
//do something
}
static public function getInstance()
{
if(!self::$_instance instanceof self)
{
//echo 'lgh-big';
self::$_instance = new self;
}
else
{
//for testing only
//echo 'gdc-xiaoairener';
}
return self::$_instance;
}
public function getHeight()
{
echo $this->height;
}
public function getAge()
{
echo $this->age;
}
}
function testInstance()
{
People::getInstance()->getAge();
}
//begin to use the class
$lgh = People::getInstance();
$lgh->getHeight();
echo '<br />';
testInstance();
?>


優(yōu)點(diǎn):單例模式可以避免大量的new操作,因?yàn)槊恳淮蝞ew操作都會消耗內(nèi)存資源和系統(tǒng)資源
缺點(diǎn):在PHP中,所有的變量無論是全局變量還是類的靜態(tài)成員,都是 頁面級的,每次頁面被執(zhí)行時,都會重新建立新的對象,都會在頁面執(zhí)行完畢后被清空,這樣似乎PHP單例模式就沒有什么意義了,所以PHP單例模式我覺得只 是針對單次頁面級請求時出現(xiàn)多個應(yīng)用場景并需要共享同一對象資源時是非常有意義的。

Why–為什么要使用PHP單例模式?
PHP的一個主要應(yīng)用場合就是應(yīng)用程序與數(shù)據(jù)庫打交道的應(yīng)用場景,所以一個應(yīng)用中會存在大量的數(shù)據(jù)庫操作,比如過數(shù)據(jù)庫句柄來連接數(shù)據(jù)庫這一行為,使用單例模式可以避免大量的new操作,因?yàn)槊恳淮蝞ew操作都會消耗內(nèi)存資源和系統(tǒng)資源。
還是有些抽象,給出代碼片段。
使用傳統(tǒng)方式編碼

復(fù)制代碼 代碼如下:


<?php
......
//初始化一個數(shù)據(jù)庫句柄
$db = new DB(...);
//比如有個應(yīng)用場景是添加一條用戶信息:
$db->addUserInfo();
......
//然而我們在另外一個地方可能要查找用戶的信息,這個情景出現(xiàn)在一個函數(shù)中,這時要用到數(shù)據(jù)庫句柄資源,我們可能需要這么去做
......
function test(){
 ......
//這時我們不得不重新初始化一個數(shù)據(jù)庫句柄,試想多個應(yīng)用場景下,這樣的代碼是多么可怕啊?!
 $db = new DB(...);
 $db->getUserInfo();
 ......
//有些朋友或許會說,我也可以不這樣做啊,我直接利用global關(guān)鍵字不就可以了嗎?的確,global可以解決問題,也起到了單例模式的作用,但是OOP中,我們拒絕這樣來編寫代碼,因?yàn)間lobal存在安全隱患,請參考相關(guān)書籍,同時單例模式恰恰是對全局變量的一種改進(jìn),避免了那些存儲唯一實(shí)例的全局變量污染命名空間
 global $db;  //OOP中,我們不提倡這樣編寫代碼
......
}


使用單例模式編碼

復(fù)制代碼 代碼如下:


<?php
......
//所有的應(yīng)用情景只有一個數(shù)據(jù)庫句柄資源,嘿嘿,效率老高了,
//資源也大大的得到節(jié)省,代碼簡潔明了:)
DB::getInstance()->addUserInfo();
DB::getInstance()->getUserInfo();
......


How–如何來編寫PHP單例模式?
在了解了單例模式的應(yīng)用場景之后,下面我們通過編寫單例模式的具體實(shí)現(xiàn)代碼來掌握PHP單例模式的核心要點(diǎn),代碼如下:

復(fù)制代碼 代碼如下:


<?php
/**
 *  PHP單例模式演示舉例
*  @author   guohua.li
 *  @modify  2010-07-11
*  @website  http://blog.163.com/lgh_2002/
*/
class User{
/**
 *  靜態(tài)成品變量 保存全局實(shí)例
 *  @access private
*/
static private $_instance = NULL;
/**
 *  私有化構(gòu)造函數(shù),防止外界實(shí)例化對象
*/
private function  __construct() {}
/**
 *  私有化克隆函數(shù),防止外界克隆對象
*/
private function  __clone(){}
/**
 *  靜態(tài)方法, 單例統(tǒng)一訪問入口
 *  @return  object  返回對象的唯一實(shí)例
*/
static public function getInstance() {
if (is_null(self::$_instance) || !isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
   /**
 * 測試方法: 獲取用戶名字
*/
public function getName() {
echo 'hello liguohua!';
}
}


從以上代碼中,我們總結(jié)出PHP單例模式實(shí)現(xiàn)的核心要點(diǎn)有如下三條:
1.需要一個保存類的唯一實(shí)例的靜態(tài)成員變量(通常為$_instance私有變量)
2.構(gòu)造函數(shù)和克隆函數(shù)必須聲明為私有的,這是為了防止外部程序new類從而失去單例模式的意義
3.必須提供一個訪問這個實(shí)例的公共的靜態(tài)方法(通常為getInstance方法),從而返回唯一實(shí)例的一個引用
PHP單例模式的缺點(diǎn)
眾所周知,PHP語言是一種解釋型的腳本語言,這種運(yùn)行機(jī)制使得每個PHP頁面被解釋執(zhí)行后,所有的相關(guān)資源都會被回收。也就是說,PHP在語言級別上沒有辦法讓某個對象常駐內(nèi)存,這和asp.net、Java等編譯型是不同的,比如在Java中單例會一直存在于整個應(yīng)用程序的生命周期里,變量是跨頁面級的,真正可以做到這個實(shí)例在應(yīng)用程序生命周期中的唯一性。然而在PHP中,所有的變量無論是全局變量還是類的靜態(tài)成員,都是頁面級的,每次頁面被執(zhí)行時,都會重新建立新的對象,都會在頁面執(zhí)行完畢后被清空,這樣似乎PHP單例模式就沒有什么意義了,所以PHP單例模式我覺得只是針對單次頁面級請求時出現(xiàn)多個應(yīng)用場景并需要共享同一對象資源時是非常有意義的。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久一日本道色综合久久 | 精品国偷自产国产一区 | 精品久久久中文字幕 | 免费观看国产精品 | 美女视频一区二区三区 | 国产精品久久精品 | 亚洲视频综合 | 日本精品一区二区三区视频 | 日韩欧美国产一区二区 | 美女羞羞网站 | 久久久99久久 | 波多一区二区 | 亚洲视频一区二区三区在线观看 | 久久免费视频9 | 国产精品美女久久久久久久久久久 | 免费成人av片 | 午夜影院a | av国产精品 | 丝袜+亚洲+另类+欧美+变态 | 欧美日韩精品免费观看 | av网站免费线看 | 一区欧美| 91婷婷射| 国产精品二区一区二区aⅴ污介绍 | 欧美成人激情视频 | 亚洲一区二区在线 | 国产视频久久久 | 狠狠干欧美 | 欧美黄色一区 | av免费在线观看网站 | 亚洲精品成人 | 久久久久久久国产精品免费播放 | 丁香伊人 | 久久久精品网 | 色视频免费在线 | 深夜免费网站 | 黄视频免费 | 午夜社区 | 免费在线看a | 国产精品久久久久久久久久久久久久 | 99视频在线 |