激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

香港云服务器
服務器之家 - 編程語言 - PHP教程 - 雞肋的PHP單例模式應用詳解

雞肋的PHP單例模式應用詳解

2020-03-28 12:24PHP教程網 PHP教程

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

單例模式的要點有三個:
一是某個類只能有一個實例;
二是它必須自行創建這個實例;
三是它必須自行向整個系統提供這個實例。

復制代碼 代碼如下:


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

* 也就是說,PHP在語言級別上沒有辦法讓某個對象常駐內存。在PHP中,所有的變量都是頁面級的,無論是全局變量,
* 還是類的靜態成員,都會在頁面執行完畢后被清空,結果會重新建立新的對象,這樣也就完全失去了Singleton的意義。
* 不過,在實際應用中同一個頁面中可能會存在多個業務邏輯,這時單例模式就起到了很重要的作用,有效的避免了重復
* new 對象(注: new 對象會消耗內存資源)這么一個行為,所以我們說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();
?>


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

Why–為什么要使用PHP單例模式?
PHP的一個主要應用場合就是應用程序與數據庫打交道的應用場景,所以一個應用中會存在大量的數據庫操作,比如過數據庫句柄來連接數據庫這一行為,使用單例模式可以避免大量的new操作,因為每一次new操作都會消耗內存資源和系統資源。
還是有些抽象,給出代碼片段。
使用傳統方式編碼

復制代碼 代碼如下:


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


使用單例模式編碼

復制代碼 代碼如下:


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


How–如何來編寫PHP單例模式?
在了解了單例模式的應用場景之后,下面我們通過編寫單例模式的具體實現代碼來掌握PHP單例模式的核心要點,代碼如下:

復制代碼 代碼如下:


<?php
/**
 *  PHP單例模式演示舉例
*  @author   guohua.li
 *  @modify  2010-07-11
*  @website  http://blog.163.com/lgh_2002/
*/
class User{
/**
 *  靜態成品變量 保存全局實例
 *  @access private
*/
static private $_instance = NULL;
/**
 *  私有化構造函數,防止外界實例化對象
*/
private function  __construct() {}
/**
 *  私有化克隆函數,防止外界克隆對象
*/
private function  __clone(){}
/**
 *  靜態方法, 單例統一訪問入口
 *  @return  object  返回對象的唯一實例
*/
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!';
}
}


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

延伸 · 閱讀

精彩推薦
589
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 亚洲一区二区三区在线播放 | 九九热在线视频观看这里只有精品 | 女人解衣喂奶电影 | 欧美大片一级毛片 | 久久国产一级片 | 色偷偷欧美 | 国产亚洲精品综合一区91 | 久久一本日日摸夜夜添 | 成人毛片在线免费看 | 99精品国产小情侣高潮露脸在线 | 天堂成人国产精品一区 | 成人在线观看免费爱爱 | 久久国产成人精品国产成人亚洲 | 久久福利电影网 | 99国产精品自拍 | 久久精品欧美视频 | 亚洲射情 | 污片在线观看视频 | 男女羞羞视频在线观看免费 | 制服丝袜日日夜夜 | 一级免费大片 | 精品无码久久久久久国产 | 91午夜在线观看 | 久久在线免费视频 | 国产中出在线观看 | 日本精品中文字幕 | chinese xvideos gay| 综合网日日天干夜夜久久 | 成人免费乱码大片a毛片视频网站 | 国产精品久久久久久久久岛 | 99麻豆久久久国产精品免费 | 人人做人人看 | 国产69精品久久久久9999不卡免费 | 久久久久久久一区二区 | 最新黄色毛片 | 91av大片 | 精品久久久久久亚洲精品 | 正在播放91精 | 极品xxxx欧美一区二区 | 成人国产在线看 | 日韩视频精品 |