徹底認清php單例模式的本質,php單例模式demo

本文目錄一覽:

php設計模式中工廠模式和單例模式的區別

工廠模式使用時,返回的對象之間沒有關係。單例模式返回始終是同一個對象。可以在代碼的定義明顯的區分出來,單例模式的構造函數 一般是私有的,不允許實例化,通過內部靜態方法實例化自己,同類型的對象始終返回同一個。

php中,什麼是單一模式?優缺點?

php單一入口模式可謂是現在一種比較流行的大型web應用開發模式,比如當前比較流行的一些php開發框架,zend,thinkphp,qeephp,還有cakephp

等他們都是採用的單一入口模式的。本文將就什麼是單一入口模式,單一入口模式有哪些優點以缺點做一下研究。

什麼是單一入口?

在解釋什麼是單一入口之前,先說說與之對應的多入口。多入口即通過訪問不同的 php 文件運行對應的功能。比如剛開始學習 php

的時候,我們做一個項目通常都會如下這樣做:

index.php – 網站首頁

list.php?page=5 – 內容列表頁

info.php?id=12 – 內容詳細頁

login.php – 用戶登錄頁

對於這個項目來說,這其實就是一個多入口。

那麼單一入口的應用程序就是說用一個文件處理所有的HTTP請求,例如不管是內容列表頁,用戶登錄頁還是內容詳細頁,都是通過從瀏覽器訪問 index.php

文件來進行處理的,這裡這個 index.php 文件就是這個應用程序的單一入口。

php 是如何實現單一入口的呢?

很簡單,一般單一入口程序都是在訪問index.php時附帶一個特定的參數。例如:index.php?action=list 就可以定義為訪問內容列表頁,而

index.php?action=info 則可以定義為訪問內容詳細頁等,具體實現代碼如下:

//從url中取出action參數,如果沒有提供action參數,就設置一個默認的’index’作為參數

$action=$_GET[‘action’]==”?’index’:$_GET[‘action’];

//根據$action參數調用不同的代碼文件,從而滿足單一入口實現對應的不同的功能

include(‘files/’.$action.’.php’);

以上這個就實現了一個最簡單的單一入口模式程序,當然真正的單一入口模式會比這個要複雜很多。但只要懂得如何合理組織各個功能的處理代碼並遵循一定的步驟,也可以輕鬆的解決掉這個難題,下面就一個後台的例子來做一下說明:

比如我們現在要做一個新聞管理的後台。那麼首先,對於應用程序的功能要做出一個合理的分解。例如後台的新聞欄目可能包含“添加新聞”、“編輯新聞”、“刪除新聞”等多個功能。這時我們就可以將這一組邏輯上關聯的功能組合到一個功能模塊中,稱為“新聞管理”模塊。

按照上面的方法整理完應用程序的功能,我們就會得到多個功能模塊,而每個模塊又是由多個功能組成(實際上,即便不是單一入口應用程序,功能的整理也是必須的步驟)。

整理完功能後,我們就需要確定如何存放各個功能的代碼。這裡我推薦兩種方式:

1、每個功能模塊一個子目錄,目錄里的每一個文件就是一個功能的實現代碼。

種方式的好處是每個功能的代碼都互相隔離,非常便於多人協作。缺點是每個功能之間共享代碼和數據不那麼方便。例如新聞管理模塊中的所有功能都需要一個“取

出新聞欄目記錄”的功能,那麼採用這種多個獨立文件的組織方式,“取出新聞欄目記錄”就只能寫在另一個文件中,然後由需要該功能的文件include

進去。

2、每個模塊一個文件,模塊中的每個功能寫成一個函數或者一個類方法。

好處不用多說了,非常便於共享代碼和數據。缺點就是如果幾個人同時改,容易發生衝突。不過藉助版本控制軟件和差異比較合併工具,衝突還是很容易解決的。

單一入口應用程序對應多入口有哪些優勢呢?

一入口應用程序的所有http請求都是通過index.php接收並轉發到功能代碼中去的,所以在index.php裡面就能完成許多實際工作(所有頁面

都需要做的且都一樣的工作)。比如進行集中的安全性檢查,訪問統計等等,如果不是單一入口,那麼開發者就必須記得在每一個文件的開始加上安全性檢查代碼,

當然,你也許會說,多入口的安全性檢查可以寫到另一個文件中,然後include一下就可以了。但實際針對一個相對較大型一點的應用項目,在幾十個文件中

保持頭部的幾個include都一致可不是一件讓人省心的事。

與安全性檢查類似。在入口裡,我們還可以對url參數和post進行必要的檢查和特殊字符過濾、記錄日誌、訪問統計等等各種可以集中處理的任務。這樣就可以看出,由於這些工作都被集中到了index.php來完成,可以減輕我們維護其他功能代碼的難度。

單一入口應用程序的缺點?

任何事情都有兩面性,單一入口應用程序也不例外。由於所有http請求都是訪問 index.php ,所以程序的 url

看起來不那麼美觀,特別是對搜索引擎來說不太友好。比如下面這個 url:

;action=index

我們知道這種URl不太方便記憶,而且搜索引擎不認它是一個正常的 URL,當然是相比下面這種 URl 來說的:

不過這個也不是什麼大問題,可以採用url重寫、PATHINFO等方式就可以輕鬆解決這個問題。

OK,單一入口模式就寫這麼多了,當然要想深刻理解單一模式,最好的辦法還是自己嘗試着用單一入口模式寫一個小應用出來深刻體會一下。

本文地址:

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中的設計模式

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

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

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

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
SPWM的頭像SPWM
上一篇 2024-10-04 00:23
下一篇 2024-10-04 00:23

相關推薦

  • PHP和Python哪個好找工作?

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

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

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

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

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

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

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

    編程 2025-04-28
  • Qt State Machine與狀態機模式

    本文將介紹Qt State Machine和狀態機模式在Qt中的實現。Qt提供了QStateMachine和QState兩個類,可以方便地實現狀態機模式,並且能有效地處理複雜的、多…

    編程 2025-04-27
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若服務器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27
  • 顯示C++設計模式

    本文將詳細介紹顯示C++設計模式的概念、類型、優點和代碼實現。 一、概念 C++設計模式是在軟件設計階段定義,用於處理常見問題的可重用解決方案。這些解決方案是經過測試和驗證的,並已…

    編程 2025-04-27
  • PHP登錄頁面代碼實現

    本文將從多個方面詳細闡述如何使用PHP編寫一個簡單的登錄頁面。 1. PHP登錄頁面基本架構 在PHP登錄頁面中,需要包含HTML表單,用戶在表單中輸入賬號密碼等信息,提交表單後服…

    編程 2025-04-27
  • Centos7進入單用戶模式的解釋

    本文將介紹如何在Centos7中進入單用戶模式,並從以下幾個方面進行詳細的闡述。 一、Centos7進入單用戶模式的解答 在Centos7中進入單用戶模式需要執行以下步驟: 1. …

    編程 2025-04-27
  • PHP與Python的比較

    本文將會對PHP與Python進行比較和對比分析,包括語法特性、優缺點等方面。幫助讀者更好地理解和使用這兩種語言。 一、語法特性 PHP語法特性: <?php // 簡單的P…

    編程 2025-04-27

發表回復

登錄後才能評論