php為什麼要使用單例模式

黄舟
發布: 2023-03-15 18:32:02
原創
2542 人瀏覽過

php使用單例模式的原因:在使用物件導向的方式開發時,使用單例模式可以避免過多的new操作消耗大量的資源。單例模式可以透過一個類別來全域控制某些配置資訊。

php為什麼要使用單例模式

一、什麼是單例模式?

1、意義   

作為物件的創建模式,單例模式確保某一個類別只有一個實例,並且自行實例化並向整個系統全局地提供這個實例。它不會建立實例副本,而是會向單例類別內部儲存的實例傳回一個參考。

php的應用主要在於資料庫應用, 所以一個應用程式中會存在大量的資料庫操作,在使用物件導向的方式開發時,如果使用單例模式,則可以避免大量的new操作消耗的資源。如果系統中需要有一個類別來全域控制某些配置訊息,那麼使用單例模式可以很方便的實作。

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

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

private static $_instance;
登入後複製

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

private function __construct()   
{   
    $this->_db = pg_connect('xxxx');  
}   
private function __clone()  
{  
}//覆盖__clone()方法,禁止克隆
登入後複製

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

public static function getInstance()    
{    
    if(! (self::$_instance instanceof self) )   
    {    
        self::$_instance = new self();    
    }  
    return self::$_instance;    
  
}
登入後複製

二、為什麼要使用單例模式?

多數人都是從單例模式的字面上的意思來理解它的用途,認為這是對系統資源的節省,可以避免重複實例化,是一種"計劃生育"。

而PHP每次執行完頁面都是會從記憶體中清理掉所有的資源。因而PHP中的單例實際每次運行都是需要重新實例化的, 這樣就失去了單例重複實例化的意義了。

單單從這個方面來說, PHP的單例的確有點讓各位失望. 但是單例僅僅只有這個功能和應用嗎? 答案是否定的,我們一起來看看。

php的應用主要在於資料庫應用, 所以一個應用程式中會存在大量的資料庫操作,在使用物件導向的方式開發時(廢話),如果使用單例模式, 則可以避免大量的new 操作消耗的資源。

如果系統中需要有一個類別來全域控制某些配置訊息,那麼使用單例模式可以很方便的實作.。 這個可以參考zend Framework的FrontController部分。

在一次頁面請求中, 便於進行調試, 因為所有的代碼(例如數據庫操作類db)都集中在一個類中, 我們可以在類中設置鉤子, 輸出日誌,從而避免到處var_dump, echo。

1、PHP缺點:

PHP語言是解釋型的腳本語言,這種運作機制使得每個PHP頁面被解釋執行後,所有的相關資源都會被回收。

也就是說,PHP在語言層級上沒有辦法讓某個物件常駐內存,這和asp.net、Java等編譯型是不同的,例如在Java中單例會一直存在於整個應用在程式的生命週期裡,變數是跨頁面層級的,真正可以做到這個實例在應用程式生命週期中的唯一性。

然而在PHP中,所有的變數無論是全域變數或類別的靜態成員,都是頁面層級的,每次頁面被執行時,都會重新建立新的對象,都會在頁面執行完畢後被清空,這樣似乎PHP單例模式就沒有什麼意義了。

所以PHP單例模式我覺得只是針對單次頁面級請求時出現多個應用場景並需要共享同一物件資源時是非常有意義的。

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

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

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

(2)、控製配置資訊

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

#更多相關知識,請造訪 PHP中文網! !

以上是php為什麼要使用單例模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板