看懂php單例模式,看懂php單例模式的網站

本文目錄一覽:

PHP設計模式之單例模式

單例模式

:使得類的一個對象成為系統中的唯一實例.

PHP中使用單例模式最常見的就是資料庫操作了。避免在系統中有多個連接資料庫的操作,浪費系統資源的現象,就可以使用單例模式。每次對資料庫操作都使用一個實例。

簡單示例

class

AClass

{

//

用來存儲自己實例

public

static

$instance;

//

私有化構造函數,防止外界實例化對象

private

function

__construct()

{}

//

私有化克隆函數,防止外界克隆對象

private

function

__clone()

{}

//

靜態方法,單例訪問統一入口

public

static

function

getInstance()

{

if

(!(self::$instance

instanceof

self)){

self::$instance

=

new

self();

}

return

self::$instance;

}

//

test

public

function

test()

{

return

“done”;

}

//

私有化克隆函數,防止外界克隆對象

private

function

__clone()

{}

}

class

BClass

extends

AClass{

}

//

獲取實例

$aclass

=

AClass::getInstance();

$bclass

=

BClass::getInstance();

//

調用方法

echo

$aclass-test();

對一些比較大型的應用來說,可能連接多個資料庫,那麼不同的資料庫公用一個對象可能會產生問題,比如連接句柄的分配等,我們可以通過給$instance變成數組,通過不同的參數來控制

簡單示例

class

DB

{

//

用來存儲自己實例

public

static

$instance

=

array();

public

$conn;

//

私有化構造函數,防止外界實例化對象

private

function

__construct($host,

$username,

$password,

$dbname,

$port)

{

$this-conn

=

new

mysqli($host,

$username,

$password,

$dbname,

$port);

}

//

靜態方法,單例訪問統一入口

public

static

function

getInstance($host,

$username,

$password,

$dbname,

$port)

{

$key

=

$host.”:”.$port;

if

(!(self::$instance[$key]

instanceof

self)){

self::$instance[$key]

=

new

self($host,

$username,

$password,

$dbname,

$port);#實例化

}

return

self::$instance[$key];

}

//query

public

function

query($ql)

{

return

$this-conn-query($sql);

}

//

私有化克隆函數,防止外界克隆對象

private

function

__clone()

{}

//釋放資源

public

function

__destruct(){

$this-conn-close();

}

}

php 單例模式

單例模式是一種常用的軟體設計模式,可以保證系統中一個類只有一個實例,從而達到節約系統資源提升特殊類使用效率的目的

php實現單例模式的方法

class A {

    //靜態屬性

    private static $_instance;

    

    //空的克隆方法,防止被克隆

    private function __clone() {}

    

    //獲取實例

    public static function getInstance() {

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

          self::$_instance = new A();

        }

        return self::$_instance;

    }

}

//調用

$obj = A::getInstance();

PHP單例模式是什麼 php實現單例模式的方法

單例模式是一種常用的軟體設計模式。

在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個實例而且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。

如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。

為什麼要使用PHP單例模式及應用實例

單例模式顧名思義,就是只有一個實例。作為對象的創建模式,

單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例,這個類我們稱之為單例類。單例模式的要點有三個:一是某個類只能有一個實例;二是它必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。下面我們討論下為什麼要使用PHP單例模式?多數人都是從單例模式的字面上的意思來理解它的用途,

認為這是對系統資源的節省,

可以避免重複實例化,

是一種”計劃生育”.

而PHP每次執行完頁面都是會從內存中清理掉所有的資源.

因而PHP中的單例實際每次運行都是需要重新實例化的,

這樣就失去了單例重複實例化的意義了.

單單從這個方面來說,

PHP的單例的確有點讓各位失望.

但是單例僅僅只有這個功能和應用嗎?

答案是否定的,我們一起來看看。1.

php的應用主要在於資料庫應用,

所以一個應用中會存在大量的資料庫操作,

在使用面向對象的方式開發時(廢話),

如果使用單例模式,

則可以避免大量的new

操作消耗的資源。2.

如果系統中需要有一個類來全局控制某些配置信息,

那麼使用單例模式可以很方便的實現.

這個可以參看zend

Framework的FrontController部分。

怎麼理解php中的設計模式

1、單例模式:PHP中的對象生存期間是從該腳本開始一直到該腳本結束為止,因此PHP的單例模式只是在一個頁面中(這裡可能包含很多其他頁面,不是狹義的單頁面)多次用到該對象時才會起作用,多次用到時不去重複的new對象(多個人做一個項目時,難免會碰到一次請求中多次實例一個對象的情況),將不會耗費不必要的資源(數據控連接操做效果很明顯),還有一點就是可以保證整個腳本中都是同一個對象,這種模式是怎麼實現的呢,他的實現有幾個要注意的點:

a. 首先就是要將__construct()方法定義為私有方法,這樣就不能通過new來得到一個新的實例了,單例模式不能在外部進行實例化,這能字自身內部進行實例化;

PHP單例模式應用場景有哪些

單例模式的要點有三個:

一是某個類只能有一個實例;

二是它必須自行創建這個實例;

三是它必須自行向整個系統提供這個實例。

複製代碼 代碼如下:

?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();

?

優點:單例模式可以避免大量的new操作,因為每一次new操作都會消耗內存資源和系統資源

缺點:在PHP中,所有的變數無論是全局變數還是類的靜態成員,都是 頁面級的,每次頁面被執行時,都會重新建立新的對象,都會在頁面執行完畢後被清空,這樣似乎PHP單例模式就沒有什麼意義了,所以PHP單例模式我覺得只 是針對單次頁面級請求時出現多個應用場景並需要共享同一對象資源時是非常有意義的。

Why–為什麼要使用PHP單例模式?

PHP的一個主要應用場合就是應用程序與資料庫打交道的應用場景,所以一個應用中會存在大量的資料庫操作,比如過資料庫句柄來連接資料庫這一行為,使用單例模式可以避免大量的new操作,因為每一次new操作都會消耗內存資源和系統資源。

還是有些抽象,給出代碼片段。

使用傳統方式編碼

複製代碼 代碼如下:

?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();

……

How–如何來編寫PHP單例模式?

在了解了單例模式的應用場景之後,下面我們通過編寫單例模式的具體實現代碼來掌握PHP單例模式的核心要點,代碼如下:

複製代碼 代碼如下:

?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!’;

}

}

從以上代碼中,我們總結出PHP單例模式實現的核心要點有如下三條:

1.需要一個保存類的唯一實例的靜態成員變數(通常為$_instance私有變數)

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

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

PHP單例模式的缺點

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

原創文章,作者:HPUG,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/143875.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
HPUG的頭像HPUG
上一篇 2024-10-24 15:26
下一篇 2024-10-24 15:26

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • Python爬蟲可以爬哪些網站

    Python是被廣泛運用於數據處理和分析領域的編程語言之一。它具有易用性、靈活性和成本效益高等特點,因此越來越多的人開始使用它進行網站爬取。本文將從多個方面詳細闡述,Python爬…

    編程 2025-04-29
  • 網站為什麼會被黑客攻擊?

    黑客攻擊是指利用計算機技術手段,入侵或者破壞計算機信息系統的一種行為。網站被黑客攻擊是常見的安全隱患之一,那麼,為什麼網站會被黑客攻擊呢?本文將從不同角度分析這個問題,並且提出相應…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • 如何用Python訪問網站

    本文將從以下幾個方面介紹如何使用Python訪問網站:網路請求、POST請求、用戶代理、Cookie、代理IP、API請求。 一、網路請求 Python有三種主流的網路請求庫:ur…

    編程 2025-04-29
  • 如何將Python開發的網站變成APP

    要將Python開發的網站變成APP,可以通過Python的Web框架或者APP框架,將網站封裝為APP的形式。常見的方法有: 一、使用Python的Web框架Django Dja…

    編程 2025-04-28
  • 如何在伺服器上運行網站

    想要在伺服器上運行網站,需要按照以下步驟進行配置和部署。 一、選擇伺服器和域名 想要在伺服器上運行網站,首先需要選擇一台雲伺服器或者自己搭建的伺服器。雲伺服器會提供更好的穩定性和可…

    編程 2025-04-28
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • Python網站源碼解析

    本文將從多個方面對Python網站源碼進行詳細解析,包括搭建網站、數據處理、安全性等內容。 一、搭建網站 Python是一種高級編程語言,適用於多種領域。它也可以用於搭建網站。最常…

    編程 2025-04-28
  • 手機安全模式怎麼解除?

    安全模式是一種手機自身的保護模式,它會禁用第三方應用程序並使用僅限基本系統功能。但有時候,安全模式會使你無法使用手機上的一些重要功能。如果你想解除手機安全模式,可以嘗試以下方法: …

    編程 2025-04-28

發表回復

登錄後才能評論