導航:首頁 > 編程語言 > php單例類

php單例類

發布時間:2022-08-18 03:34:03

1. 什麼是php單例模式

PHP單例模式,就是一個對象只被生成一次,但該對象可以被其它眾多對象使用。單例模式使用最多的場景,是資料庫連接操作。我們知道,生成一個對象的操作是用new函數來實現,但是new對象都會消耗內存,而且有時候對同一個對象,在不同文件中可能會生成多次,這就造成了系統資源的浪費。然而使用單例模式,則可以很好的避免這種情況。


以資料庫為例,假設我們有一個資料庫的類,要實現資料庫連接。如果不使用單例模式,那麼在很多PHP文件中,我們可能到要創建這樣的一個連接,這其實是對資源的很大浪費。那麼下面介紹單例模式實現方法:

classDatabase
{
//定義一個屬性,該屬性是靜態的保護或私有屬性
protectedstatic$db;

//這里構造函數一定要是私有方法
privatefunction__construct()
{

}

//聲明一個獲取類實例的方法
staticfunctiongetInstace()
{
if(self::$db){
returnself::$db;
}else{
//生成自己
self::$db=newself();
returnself::$db;
}
}
}

//錯誤調用方法
//用new實例化private標記構造函數的類會報錯
$db=newDatabase();

//正確獲取實例方法
$db=Database::getInstace();

使用單例模式的好處是,當你在其他地方也要使用到這個類,比如上面的資料庫類。那麼你可以在其它地方直接調用Database::getInstace(),而且該實例只會被生成一次,不會被重復生成,所以不會浪費系統資源。


簡單的說,單例模式生成的實例只被生成一次,而且只負責一個特定的任務。


使用單例模式有下面幾個要求:

1.構造函數需要標記為private(訪問控制:防止外部代碼使用new操作符創建對象),單例類不能在其他類中實例化,只能被其自身實例化;

2.擁有一個保存類的實例的靜態成員變數;

3.擁有一個訪問這個實例的公共的靜態方法(常用getInstance()方法進行實例化單例類,通過instanceof操作符可以檢測到類是否已經被實例化);

4.如果嚴謹的話,還需要創建__clone()方法防止對象被復制(克隆)。(我上面沒創建)


使用單例模式好處,總結:

1、php的應用主要在於資料庫應用, 所以一個應用中會存在大量的資料庫操作, 使用單例模式, 則可以避免大量的new 操作消耗的資源。

2、如果系統中需要有一個類來全局控制某些配置信息, 那麼使用單例模式可以很方便的實現. 這個可以參看ZF的FrontController部分。

3、在一次頁面請求中, 便於進行調試。

參考:http://coderschool.cn/1523.html

2. php 單例模式

單例模式是一種常用的軟體設計模式,可以保證系統中一個類只有一個實例,從而達到節約系統資源提升特殊類使用效率的目的


php實現單例模式的方法

classA{
//靜態屬性
privatestatic$_instance;

//空的克隆方法,防止被克隆
privatefunction__clone(){}

//獲取實例
(){
if(!(self::$_instanceinstanceofself)){
self::$_instance=newA();
}
returnself::$_instance;
}
}

//調用
$obj=A::getInstance();

3. php單例模式是怎麼實現的呢

單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。

4. 為什麼要使用PHP單例模式及應用實例

單例模式顧名思義,就是只有一個實例。作為對象的創建模式,
單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例,這個類我們稱之為單例類。單例模式的要點有三個:一是某個類只能有一個實例;二是它必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。下面我們討論下為什麼要使用PHP單例模式?多數人都是從單例模式的字面上的意思來理解它的用途,
認為這是對系統資源的節省,
可以避免重復實例化,
是一種"計劃生育".
而PHP每次執行完頁面都是會從內存中清理掉所有的資源.
因而PHP中的單例實際每次運行都是需要重新實例化的,
這樣就失去了單例重復實例化的意義了.
單單從這個方面來說,
PHP的單例的確有點讓各位失望.
但是單例僅僅只有這個功能和應用嗎?
答案是否定的,我們一起來看看。1.
php的應用主要在於資料庫應用,
所以一個應用中會存在大量的資料庫操作,
在使用面向對象的方式開發時(廢話),
如果使用單例模式,
則可以避免大量的new
操作消耗的資源。2.
如果系統中需要有一個類來全局控制某些配置信息,
那麼使用單例模式可以很方便的實現.
這個可以參看zend
Framework的FrontController部分。

5. php如何實現單例模式

類的單例模式:
class Single
{
public $rand;
static public $ob;
protected function __construct(){
$this->rand = mt_rand(1000, 99999);
}

static public function getIns(){
if(!Single::$ob){
Single::$ob = new Single();
}
return Single::$ob;
}
}
v(Single::getIns());
v(Single::getIns());

6. PHP,編寫一個單例類,類名為SysConfig

<?php
classSysConfig{
privatefunction__construct()
{
}

publicstaticfunctionInstance()
{

static$instance=null;
if(!$instance){
$instance=newSysConfig();
}
return$instance;
}
}

用法 $conf=SysConfig::Instance()

7. PHP的單例模式有什麼用

給出你的代碼,單例模式一般也就是強調類的靜態調用,一個進程對一個類的多次調用只產生一個類對象,具體你得給出你的類代碼才好幫你修寫,

8. 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單例模式我覺得只是針對單次頁面級請求時出現多個應用場景並需要共享同一對象資源時是非常有意義的。

9. PHP設計模式之單例模式

單例模式
:使得類的一個對象成為系統中的唯一實例.
PHP中使用單例模式最常見的就是資料庫操作了。避免在系統中有多個連接資料庫的操作,浪費系統資源的現象,就可以使用單例模式。每次對資料庫操作都使用一個實例。
簡單示例
class
AClass
{
//
用來存儲自己實例
public
static
$instance;
//
私有化構造函數,防止外界實例化對象
private
function
__construct()
{}
//
私有化克隆函數,防止外界克隆對象
private
function
__clone()
{}
//
靜態方法,單例訪問統一入口
public
static
function
getInstance()
{
if
(!(self::$instance
instanceof
self)){
self::$instance
=
new
self();
}
return
self::$instance;
}
//
test
public
function
test()
{
return
"done";
}
//
私有化克隆函數,防止外界克隆對象
private
function
__clone()
{}
}
class
BClass
extends
AClass{
}
//
獲取實例
$aclass
=
AClass::getInstance();
$bclass
=
BClass::getInstance();
//
調用方法
echo
$aclass->test();
對一些比較大型的應用來說,可能連接多個資料庫,那麼不同的資料庫公用一個對象可能會產生問題,比如連接句柄的分配等,我們可以通過給$instance變成數組,通過不同的參數來控制
簡單示例
class
DB
{
//
用來存儲自己實例
public
static
$instance
=
array();
public
$conn;
//
私有化構造函數,防止外界實例化對象
private
function
__construct($host,
$username,
$password,
$dbname,
$port)
{
$this->conn
=
new
mysqli($host,
$username,
$password,
$dbname,
$port);
}
//
靜態方法,單例訪問統一入口
public
static
function
getInstance($host,
$username,
$password,
$dbname,
$port)
{
$key
=
$host.":".$port;
if
(!(self::$instance[$key]
instanceof
self)){
self::$instance[$key]
=
new
self($host,
$username,
$password,
$dbname,
$port);#實例化
}
return
self::$instance[$key];
}
//query
public
function
query($ql)
{
return
$this->conn->query($sql);
}
//
私有化克隆函數,防止外界克隆對象
private
function
__clone()
{}
//釋放資源
public
function
__destruct(){
$this->conn->close();
}

}

10. PHP為什麼以及什麼時候使用單例模式

單例模式確保某個類只有一個實例
1.只能有一個實例。
2.必須自行創建這個實例。
3.必須給其他對象提供這一實例。
那麼為什麼要使用PHP單例模式?
PHP一個主要應用場合就是應用程序與資料庫打交道的場景,在一個應用中會存在大量的資料庫操作,針對資料庫句柄連接資料庫的行為,使用單例模式可以避免大量的new操作。因為每一次new操作都會消耗系統和內存的資源。
優點:
1. 改進系統的設計
2. 是對全局變數的一種改進
缺點:
1. 難於調試
2. 隱藏的依賴關系
3. 無法用錯誤類型的數據覆寫一個單例

閱讀全文

與php單例類相關的資料

熱點內容
pythonclass使用方法 瀏覽:222
移動加密軟體去哪下載 瀏覽:281
php彈出alert 瀏覽:207
吉林文檔課件加密費用 瀏覽:131
感測器pdf下載 瀏覽:284
隨車拍app綁定什麼設備 瀏覽:897
方維團購系統源碼 瀏覽:991
linux反彈shell 瀏覽:159
列印機介面加密狗還能用嗎 瀏覽:301
二板股票源碼 瀏覽:448
度人經pdf 瀏覽:902
怎麼配置android遠程伺服器地址 瀏覽:960
java程序員看哪些書 瀏覽:943
什麼app可以免費和外國人聊天 瀏覽:797
pdf手寫筆 瀏覽:182
別永遠傷在童年pdf 瀏覽:990
愛上北斗星男友在哪個app上看 瀏覽:421
主力散戶派發源碼 瀏覽:671
linux如何修復伺服器時間 瀏覽:61
榮縣優途網約車app叫什麼 瀏覽:479