程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP單例模式,PHP模式

PHP單例模式,PHP模式

編輯:關於PHP編程

PHP單例模式,PHP模式


一、什麼是單例模式?

1、含義   

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

 

 

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

(1)需要一個保存類的唯一實例的靜態成員變量:

private static $obj;    

(2)構造函數和克隆函數必須聲明為私有的,防止外部程序new類從而失去單例模式的意義:

private function __construct()   
{   
}
private function __clone()  
{  
}//覆蓋__clone()方法,禁止克隆  關於clone 和  __clone 魔術方法將會在本博客說明


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

public static function getInstance()    
{    
    if(!self::$obj)   
    {    
        self::$obj= new self();    
    }  
    return self::$_instance; 
}      關於self 和  $this 不理解的同學請看這裡。

http://www.cnblogs.com/moxiaoan/p/6228905.html

 

關於靜態變量與靜態方法不理解的可以看這裡。

http://www.cnblogs.com/moxiaoan/p/6228948.html


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

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

 

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

(1)應用程序與數據庫交互

        一個應用中會存在大量的數據庫操作,比如過數據庫句柄來連接數據庫這一行為,使用單例模式可以避免大量的new操作,因為每一次new操作都會消耗內存資源和系統資源。

(2)控制配置信息

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

 

 

三、如何實現單例模式?

1、普通的數據庫訪問例子:

//初始化一個數據庫句柄  
$db = new DB(...);  

//添加用戶信息  
$db->addUserInfo(...);  

......  

//在函數中訪問數據庫,查找用戶信息  
function getUserInfo()  
{  
    $db = new DB(...);//再次new 數據庫類,和數據庫建立連接  
    $db = query(....);//根據查詢語句訪問數據庫  
}  

?>  

 


2、應用單例模式對數據庫進行操作:

 

class DB    
{    
    private static $obj;    
    private function __construct(...)    
    {    
        
    }    
    private function __clone() {}; 

    public static function getInstance()    
    {    
        if(! (self::$obj instanceof self) ) {    //  instanceof使用這個關鍵字可以確定一個對象是類的實例、類的子類,還是實現了某個特定接口.
            self::$obj = new self();    
        }    
        return self::$obj;    
    }    

    public function addUserInfo(...)  
    {  
    }  
     public function getUserInfo(...)  
    {   
    }  

}  

//test    
$db = DB::getInstance();    
$db->addUserInfo(...);    
$db->getUserInfo(...);   

?>  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved