復制代碼 代碼如下:
<?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();
?>
復制代碼 代碼如下:
<?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();
......
復制代碼 代碼如下:
<?php
/**
* PHP單例模式演示舉例
* @author guohua.li
* @modify 2010-07-11
* @website
*/
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!';
}
}
新聞熱點
疑難解答