1. 程式人生 > >PHP 單例模式例項與解析

PHP 單例模式例項與解析

一、什麼是單例模式?

1、含義

作為物件的建立模式,單例模式確保某一個類只有一個例項,而且自行例項化並向整個系統全域性地提供這個例項。它不會建立例項副本,而是會向單例類內部儲存的例項返回一個引用。

2、單例模式的三個要點:

(1). 需要一個儲存類的唯一例項的靜態成員變數:

private static $_instance;

(2). 建構函式和克隆函式必須宣告為私有的,防止外部程式new類從而失去單例模式的意義:

private function __construct(){
    $this->_db=pg_connect('xxoo');
}
private
function clone(){}

(3). 必須提供一個訪問這個例項的公共的靜態方法(通常為getInstance方法),從而返回唯一例項的一個引用

public static function getInstance(){
    if(!(self::$_instance instanceof self)){
        self::$_instance=new self();
    }
    return self::$_instance;
}

二、為什麼要使用單例模式?
1、PHP缺點:

    php語言是一種解釋型的指令碼語言,這種執行機制使得每個PHP頁面被解釋執行後,所有的相關資源都會被回收。也就是說,PHP在語言級別上沒有辦法讓某個物件常駐記憶體,這和asp.NET、Java等編譯型是不同的,比如在Java中單例會一直存在於整個應用程式的生命週期裡,變數是跨頁面級的,真正可以做到這個例項在應用程式生命週期中的唯一性。然而在PHP中,所有的變數無論是全域性變數還是類的靜態成員,都是頁面級的,每次頁面被執行時,都會重新建立新的物件,都會在頁面執行完畢後被清空,這樣似乎PHP單例模式就沒有什麼意義了,所以PHP單例模式我覺得只是針對單次頁面級請求時出現多個應用場景並需要共享同一物件資源時是非常有意義的。

2、單例模式在PHP中的應用場合:

(1)、應用程式與資料庫互動

    一個應用中會存在大量的資料庫操作,比如過資料庫控制代碼來連線資料庫這一行為,使用單例模式可以避免大量的new操作,因為每一次new操作都會消耗記憶體資源和系統資源。

(2)、控制配置資訊

    如果系統中需要有一個類來全域性控制某些配置資訊, 那麼使用單例模式可以很方便的實現.

三、如何實現單例模式?

1、普通的資料庫訪問例子:

<?php
$db=new DB(...);//初始化一個數據庫控制代碼
$db->addUserInfo(...);//新增使用者資訊


//在函式中訪問資料庫,查詢使用者資訊
function
getUserInfo(){ $db=new DB(...);//再次new 資料庫類,和資料庫建立連線 $db=query(...);//根據查詢語句訪問資料庫 }

2、應用單例模式對資料庫進行操作:

<?php
class DB{
    private $_db;
    private static $_instance;
    private function __construct(){
        $this->_db=pg_connect(...);
    }
    private function clone(){}
    public static function getInstance(){
        if(!(self::$_instance instanceof self)){
            self::$_instance=new self();
        }
        return self::$_instance;
    }
    publilc function addUserInfo(){}
    public function getUserInfo(){}
}
$db=DB::getInstance();
$db->addUserInfo(...);
$db->getUserInfo(...);