国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP設計模式之:單例模式的學習筆記

2024-05-04 21:49:57
字體:
來源:轉載
供稿:網友

單例模式小編講過非常的多了,今天小編看到一個朋友分享的一篇單例模式了,下面我們一起來看看,希望文章能夠對各位帶來幫助。

博主最近開始真正的潛心學習PHP的各種設計模式。剛開始當然從一些簡單的設計模式開始學起,比如之前發表的工廠模式,今天的單利模式,還有之后要看的注冊模式。其實這些都是比較基礎的設計模式,一些簡單的示例一看就能明白,對于稍加復雜些的示例,花點心思進去也能夠理解。可重點是,光是知道了解這么個東西是不夠的,而是如何能夠把他更好的運用的項目中去,在實踐中增加熟練度。好吧,還是說說今天要看的單例模式吧。

一、什么是單例模式?

1、含義:

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

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

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

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

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

假設我們目前需要設計一個數據庫訪問類,需要用到單例模式,看如下示例:

<?php
class DB {
    private $_db;
    private static $_instance;
    private function __construct(...)
    {
        $this->_db = pg_connect(...);//postgrsql
    }
    private function __clone() {};  //覆蓋__clone()方法,禁止克隆
    public static function getInstance() {
        if(!(self::$_instance instanceof self) ) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }
    public function sql(...) {
        /*
         * code
         */
    }
}
$db = DB::getInstance();  
$db->sql();
?>

<?php

/1**

* 設計模式之單例模式

* $_instance必須聲明為靜態的私有變量

* 構造函數和析構函數必須聲明為私有,防止外部程序new

* 類從而失去單例模式的意義

* getInstance()方法必須設置為公有的,必須調用此方法

* 以返回實例的一個引用

* ::操作符只能訪問靜態變量和靜態函數

* new對象都會消耗內存

* 使用場景:最常用的地方是數據庫連接。

* 使用單例模式生成一個對象后,

* 該對象可以被其它眾多對象所使用。

*/

class Danli {

//保存類實例的靜態成員變量

private static $_instance;

//private標記的構造方法

private function __construct(){

echo 'This is a Constructed method;';

}

//創建__clone方法防止對象被復制克隆

public function __clone(){

trigger_error('Clone is not allow!',E_USER_ERROR);

}

//單例方法,用于訪問實例的公共的靜態方法

public static function getInstance(){

if(!(self::$_instance instanceof self)){

self::$_instance = new self;

}

return self::$_instance;

}

public function test(){

echo '調用方法成功';

}

}

//用new實例化private標記構造函數的類會報錯

//$danli = new Danli();

//正確方法,用雙冒號::操作符訪問靜態方法獲取實例

$danli = Danli::getInstance();

$danli->test();

//復制(克隆)對象將導致一個E_USER_ERROR

$danli_clone = clone $danli;

例子3:

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

<?php
......  

//初始化一個數據庫句柄  

$db = new DB(...);

//添加用戶信息  

$db->addUserInfo(...); 

...... 

//在函數中訪問數據庫,查找用戶信息  

function getUserInfo()
{
    $db = new DB(...);//再次new 數據庫類,和數據庫建立連接  

    $db = query(....);//根據查詢語句訪問數據庫 
}
?>

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

<?php
class DB
{    

    private $_db;    

    private static $_instance;

    private function __construct(...)    

    {    

        $this->_db = pg_connect(...);//postgrsql    

    }
    private function __clone() {};  //覆蓋__clone()方法,禁止克隆   
    public static function getInstance()   
    {   
        if(! (self::$_instance instanceof self) ) {    

            self::$_instance = new self();    

        }    

        return self::$_instance;    

    }    

    public function addUserInfo(...)  

    {  

    }
     public function getUserInfo(...)  

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

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

1、PHP缺點:

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

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

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

(2)控制配置信息

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 林周县| 界首市| 苍南县| 桑日县| 平乡县| 新龙县| 安顺市| 廊坊市| 闸北区| 濮阳县| 米脂县| 巴中市| 旬阳县| 青川县| 通州市| 元阳县| 定陶县| 长垣县| 民权县| 新郑市| 乌鲁木齐市| 怀安县| 井研县| 方山县| 石首市| 陇南市| 溧水县| 荥经县| 合江县| 渭源县| 临汾市| 平湖市| 葵青区| 察雅县| 陆良县| 六安市| 阿合奇县| 泰宁县| 白朗县| 镇安县| 张家川|