最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2013年06月03日 08:54:20   作者:  
本篇文章是對(duì)php單例模式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
單例模式的要點(diǎn)有三個(gè):
一是某個(gè)類只能有一個(gè)實(shí)例;
二是它必須自行創(chuàng)建這個(gè)實(shí)例;
三是它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。
復(fù)制代碼 代碼如下:

<?php
/* 單例模式舉例,其要點(diǎn)如下:
*
* 1. $_instance 必須聲明為靜態(tài)的私有變量
* 2. 構(gòu)造函數(shù)和克隆函數(shù)必須聲明為私有的,這是為了防止外部程序 new 類從而失去單例模式的意義
* 3. getInstance()方法必須聲明為公有的,必須調(diào)用此方法以返回唯一實(shí)例的一個(gè)引用
* 4. ::操作符只能訪問(wèn)靜態(tài)變量或靜態(tài)函數(shù)
* 5. PHP的單例模式是相對(duì)而言的,因?yàn)镻HP的解釋運(yùn)行機(jī)制使得每個(gè)PHP頁(yè)面被解釋執(zhí)行后,所有的相關(guān)資源都會(huì)被回收。
* 也就是說(shuō),PHP在語(yǔ)言級(jí)別上沒(méi)有辦法讓某個(gè)對(duì)象常駐內(nèi)存。在PHP中,所有的變量都是頁(yè)面級(jí)的,無(wú)論是全局變量,
* 還是類的靜態(tài)成員,都會(huì)在頁(yè)面執(zhí)行完畢后被清空,結(jié)果會(huì)重新建立新的對(duì)象,這樣也就完全失去了Singleton的意義。
* 不過(guò),在實(shí)際應(yīng)用中同一個(gè)頁(yè)面中可能會(huì)存在多個(gè)業(yè)務(wù)邏輯,這時(shí)單例模式就起到了很重要的作用,有效的避免了重復(fù)
* new 對(duì)象(注: new 對(duì)象會(huì)消耗內(nèi)存資源)這么一個(gè)行為,所以我們說(shuō)PHP的單例模式是相對(duì)而言的
*
*/
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操作都會(huì)消耗內(nèi)存資源和系統(tǒng)資源
缺點(diǎn):在PHP中,所有的變量無(wú)論是全局變量還是類的靜態(tài)成員,都是 頁(yè)面級(jí)的,每次頁(yè)面被執(zhí)行時(shí),都會(huì)重新建立新的對(duì)象,都會(huì)在頁(yè)面執(zhí)行完畢后被清空,這樣似乎PHP單例模式就沒(méi)有什么意義了,所以PHP單例模式我覺(jué)得只 是針對(duì)單次頁(yè)面級(jí)請(qǐng)求時(shí)出現(xiàn)多個(gè)應(yīng)用場(chǎng)景并需要共享同一對(duì)象資源時(shí)是非常有意義的。

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

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

使用單例模式編碼
復(fù)制代碼 代碼如下:

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

How–如何來(lái)編寫PHP單例模式?
在了解了單例模式的應(yīng)用場(chǎng)景之后,下面我們通過(guò)編寫單例模式的具體實(shí)現(xiàn)代碼來(lái)掌握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í)例化對(duì)象
*/
private function  __construct() {}
/**
 *  私有化克隆函數(shù),防止外界克隆對(duì)象
*/
private function  __clone(){}
/**
 *  靜態(tài)方法, 單例統(tǒng)一訪問(wèn)入口
 *  @return  object  返回對(duì)象的唯一實(shí)例
*/
static public function getInstance() {
if (is_null(self::$_instance) || !isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
   /**
 * 測(cè)試方法: 獲取用戶名字
*/
public function getName() {
echo 'hello liguohua!';
}
}

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

相關(guān)文章

  • WordPress中獲取所使用的模板的頁(yè)面ID的簡(jiǎn)單方法

    WordPress中獲取所使用的模板的頁(yè)面ID的簡(jiǎn)單方法

    這篇文章主要介紹了WordPress中獲取所使用的模板的頁(yè)面ID的簡(jiǎn)單方法,通過(guò)這個(gè)方法來(lái)獲取頁(yè)面的鏈接是比較方便的,需要的朋友可以參考下
    2015-12-12
  • CI框架安全類Security.php源碼分析

    CI框架安全類Security.php源碼分析

    之前我們分析了CI框架的session類session.php,本文我們繼續(xù)分析CI框架的安全類security.php文件,方便我們更詳細(xì)的了解CI框架,從而更熟練的應(yīng)用CI框架
    2014-11-11
  • 基于curl數(shù)據(jù)采集之單頁(yè)面采集函數(shù)get_html的使用

    基于curl數(shù)據(jù)采集之單頁(yè)面采集函數(shù)get_html的使用

    在做數(shù)據(jù)采集時(shí)經(jīng)常要使用到curl+正則的方式采集需要的數(shù)據(jù) 根據(jù)自己的工作經(jīng)驗(yàn) 把自己寫的一些常用自定義函數(shù) 與大家來(lái)分享 如果有寫得不恰當(dāng)?shù)牡胤?請(qǐng)多多指教
    2013-04-04
  • Laravel 在views中加載公共頁(yè)面的實(shí)現(xiàn)代碼

    Laravel 在views中加載公共頁(yè)面的實(shí)現(xiàn)代碼

    今天小編就為大家分享一篇Laravel 在views中加載公共頁(yè)面的實(shí)現(xiàn)代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-10-10
  • Laravel中ServiceProvider使用場(chǎng)景示例詳解

    Laravel中ServiceProvider使用場(chǎng)景示例詳解

    這篇文章主要為大家介紹了Laravel中ServiceProvider使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • php實(shí)例分享之mysql數(shù)據(jù)備份

    php實(shí)例分享之mysql數(shù)據(jù)備份

    本代碼實(shí)現(xiàn)了表結(jié)構(gòu)和數(shù)據(jù)完全分開(kāi),默認(rèn)有一個(gè)文件會(huì)記錄所有表的結(jié)構(gòu),然后表中數(shù)據(jù)的備份 如果超過(guò)分卷的大小則會(huì)分成多個(gè)文件,不然則一個(gè)文件
    2014-05-05
  • laravel開(kāi)發(fā)中跨域的解決方案

    laravel開(kāi)發(fā)中跨域的解決方案

    最近在開(kāi)發(fā)中遇到了跨域的需求,通過(guò)查找相關(guān)資料找到了相關(guān)的解決方法了,所以下面這篇文章主要給大家介紹了關(guān)于laravel開(kāi)發(fā)中跨域的解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-10-10
  • 大家在搶紅包,程序員在研究紅包算法

    大家在搶紅包,程序員在研究紅包算法

    微信紅包在春節(jié)的火爆程度不言而喻,廣告主投入5億現(xiàn)金紅包,與央視羊年春晚獨(dú)家合作起到了巨大的推動(dòng)作用。這就像一針大補(bǔ)丸,在短時(shí)間內(nèi)給微信帶來(lái)了極大的關(guān)注度與流量。下面通過(guò)本篇文章學(xué)習(xí)下?lián)尲t包算法是怎樣的,小伙伴們快來(lái)一起學(xué)習(xí)吧
    2015-08-08
  • PHP的反射類ReflectionClass、ReflectionMethod使用實(shí)例

    PHP的反射類ReflectionClass、ReflectionMethod使用實(shí)例

    這篇文章主要介紹了PHP的反射類ReflectionClass、ReflectionMethod使用實(shí)例,本文同時(shí)介紹了反射是什么、反射可以做哪些事情,并給出一個(gè)具體例子,是一篇不錯(cuò)的入門文章,需要的朋友可以參考下
    2014-08-08
  • CentOS 上搭建 PHP7 開(kāi)發(fā)測(cè)試環(huán)境

    CentOS 上搭建 PHP7 開(kāi)發(fā)測(cè)試環(huán)境

    本文給大家分享的是作者在centos上搭建部署php7的開(kāi)發(fā)測(cè)試環(huán)境的全部過(guò)程,非常的細(xì)致,有需要的小伙伴可以參考下
    2017-02-02

最新評(píng)論

盐津县| 泰和县| 安新县| 嘉兴市| 胶南市| 双江| 剑河县| 阜宁县| 尖扎县| 林口县| 桂平市| 广汉市| 普兰县| 长岛县| 德庆县| 沧州市| 南和县| 邹城市| 三门峡市| 大方县| 花垣县| 宁乡县| 洞头县| 海晏县| 富源县| 蕲春县| 石家庄市| 雷山县| 婺源县| 宝清县| 麟游县| 常州市| 错那县| 廊坊市| 卢湾区| 永靖县| 闻喜县| 奎屯市| 兴文县| 苍南县| 麻城市|