真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

php數(shù)據(jù)庫使用場景 php中數(shù)據(jù)庫怎么設(shè)計(jì)

PHP中幾種常見的開發(fā)模式

單例模式

銅梁網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站設(shè)計(jì)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)公司自2013年起到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司

$_instance必須聲明為靜態(tài)的私有變量

構(gòu)造函數(shù)和析構(gòu)函數(shù)必須聲明為私有,防止外部程序new 類從而失去單例模式的意義

getInstance()方法必須設(shè)置為公有的,必須調(diào)用此方法 以返回實(shí)例的一個引用

::操作符只能訪問靜態(tài)變量和靜態(tài)函數(shù)

new對象都會消耗內(nèi)存

使用場景:最常用的地方是數(shù)據(jù)庫連接。

使用單例模式生成一個對象后, 該對象可以被其它眾多對象所使用。

私有的__clone()方法防止克隆對象

單例模式,使某個類的對象僅允許創(chuàng)建一個。構(gòu)造函數(shù)private修飾,?

申明一個static getInstance方法,在該方法里創(chuàng)建該對象的實(shí)例。如果該實(shí)例已經(jīng)存在,則不創(chuàng)建。比如只需要創(chuàng)建一個數(shù)據(jù)庫連接。

工廠模式

工廠模式,工廠方法或者類生成對象,而不是在代碼中直接new。?

使用工廠模式,可以避免當(dāng)改變某個類的名字或者方法之后,在調(diào)用這個類的所有的代碼中都修改它的名字或者參數(shù)。

* 如果某個類在很多的文件中都new ClassName(),那么萬一這個類的名字

* 發(fā)生變更或者參數(shù)發(fā)生變化,如果不使用工廠模式,就需要修改每一個PHP

* 代碼,使用了工廠模式之后,只需要修改工廠類或者方法就可以了。

注冊模式

注冊模式,解決全局共享和交換對象。已經(jīng)創(chuàng)建好的對象,掛在到某個全局可以使用的數(shù)組上,在需要使用的時候,直接從該數(shù)組上獲取即可。將對象注冊到全局的樹上。任何地方直接去訪問。

策略模式

策略模式,將一組特定的行為和算法封裝成類,以適應(yīng)某些特定的上下文環(huán)境。?

eg:假如有一個電商網(wǎng)站系統(tǒng),針對男性女性用戶要各自跳轉(zhuǎn)到不同的商品類目,并且所有的廣告位展示不同的廣告。在傳統(tǒng)的代碼中,都是在系統(tǒng)中加入各種if else的判斷,硬編碼的方式。如果有一天增加了一種用戶,就需要改寫代碼。使用策略模式,如果新增加一種用戶類型,只需要增加一種策略就可以。其他所有的地方只需要使用不同的策略就可以。?

首先聲明策略的接口文件,約定了策略的包含的行為。然后,定義各個具體的策略實(shí)現(xiàn)類。

執(zhí)行結(jié)果圖:?

總結(jié):?

通過以上方式,可以發(fā)現(xiàn),在不同用戶登錄時顯示不同的內(nèi)容,但是解決了在顯示時的硬編碼的問題。如果要增加一種策略,只需要增加一種策略實(shí)現(xiàn)類,然后在入口文件中執(zhí)行判斷,傳入這個類即可。實(shí)現(xiàn)了解耦。?

實(shí)現(xiàn)依賴倒置和控制反轉(zhuǎn)?(有待理解)?

通過接口的方式,使得類和類之間不直接依賴。在使用該類的時候,才動態(tài)的傳入該接口的一個實(shí)現(xiàn)類。如果要替換某個類,只需要提供一個實(shí)現(xiàn)了該接口的實(shí)現(xiàn)類,通過修改一行代碼即可完成替換。

觀察者模式

1:觀察者模式(Observer),當(dāng)一個對象狀態(tài)發(fā)生變化時,依賴它的對象全部會收到通知,并自動更新。?

2:場景:一個事件發(fā)生后,要執(zhí)行一連串更新操作。傳統(tǒng)的編程方式,就是在事件的代碼之后直接加入處理的邏輯。當(dāng)更新的邏輯增多之后,代碼會變得難以維護(hù)。這種方式是耦合的,侵入式的,增加新的邏輯需要修改事件的主體代碼。?

3:觀察者模式實(shí)現(xiàn)了低耦合,非侵入式的通知與更新機(jī)制。?

定義一個事件觸發(fā)抽象類。

當(dāng)某個事件發(fā)生后,需要執(zhí)行的邏輯增多時,可以以松耦合的方式去增刪邏輯。也就是代碼中的紅色部分,只需要定義一個實(shí)現(xiàn)了觀察者接口的類,實(shí)現(xiàn)復(fù)雜的邏輯,然后在紅色的部分加上一行代碼即可。這樣實(shí)現(xiàn)了低耦合。

裝飾器模式

1:裝飾器模式,可以動態(tài)的添加修改類的功能?

2:一個類提供了一項(xiàng)功能,如果要在修改并添加額外的功能,傳統(tǒng)的編程模式,需要寫一個子類繼承它,并重寫實(shí)現(xiàn)類的方法?

3:使用裝飾器模式,僅需要在運(yùn)行時添加一個裝飾器對象即可實(shí)現(xiàn),可以實(shí)現(xiàn)最大額靈活性。

PHP 里面的數(shù)據(jù)庫長鏈接應(yīng)用在什么場景

不知道detail具體指什么,剩下的是服務(wù)器localhost 是本機(jī),然后是用戶名,密碼,和數(shù)據(jù)庫的名稱。

php中redis和memcached區(qū)別和應(yīng)用場景

redis比memcached功能更多更強(qiáng)大,現(xiàn)在基本都是只用redis了.

利用redis的原子性可以給數(shù)據(jù)加鎖

可以保存臨時數(shù)據(jù),比如短信驗(yàn)證碼和session

可以用于實(shí)現(xiàn)簡單的隊(duì)列任務(wù)

可以實(shí)現(xiàn)排行榜功能

可以實(shí)現(xiàn)經(jīng)緯度距離計(jì)算

........

當(dāng)然不止這些,redis是一種key-value數(shù)據(jù)庫,他的業(yè)務(wù)場景還可以自己擴(kuò)展.

PHP單例模式應(yīng)用場景有哪些

單例模式的要點(diǎn)有三個:

一是某個類只能有一個實(shí)例;

二是它必須自行創(chuàng)建這個實(shí)例;

三是它必須自行向整個系統(tǒng)提供這個實(shí)例。

復(fù)制代碼 代碼如下:

?php

/* 單例模式舉例,其要點(diǎn)如下:

*

* 1. $_instance 必須聲明為靜態(tài)的私有變量

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

* 3. getInstance()方法必須聲明為公有的,必須調(diào)用此方法以返回唯一實(shí)例的一個引用

* 4. ::操作符只能訪問靜態(tài)變量或靜態(tài)函數(shù)

* 5. PHP的單例模式是相對而言的,因?yàn)镻HP的解釋運(yùn)行機(jī)制使得每個PHP頁面被解釋執(zhí)行后,所有的相關(guān)資源都會被回收。

* 也就是說,PHP在語言級別上沒有辦法讓某個對象常駐內(nèi)存。在PHP中,所有的變量都是頁面級的,無論是全局變量,

* 還是類的靜態(tài)成員,都會在頁面執(zhí)行完畢后被清空,結(jié)果會重新建立新的對象,這樣也就完全失去了Singleton的意義。

* 不過,在實(shí)際應(yīng)用中同一個頁面中可能會存在多個業(yè)務(wù)邏輯,這時單例模式就起到了很重要的作用,有效的避免了重復(fù)

* new 對象(注: new 對象會消耗內(nèi)存資源)這么一個行為,所以我們說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();

?

優(yōu)點(diǎn):單例模式可以避免大量的new操作,因?yàn)槊恳淮蝞ew操作都會消耗內(nèi)存資源和系統(tǒng)資源

缺點(diǎn):在PHP中,所有的變量無論是全局變量還是類的靜態(tài)成員,都是 頁面級的,每次頁面被執(zhí)行時,都會重新建立新的對象,都會在頁面執(zhí)行完畢后被清空,這樣似乎PHP單例模式就沒有什么意義了,所以PHP單例模式我覺得只 是針對單次頁面級請求時出現(xiàn)多個應(yīng)用場景并需要共享同一對象資源時是非常有意義的。

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

PHP的一個主要應(yīng)用場合就是應(yīng)用程序與數(shù)據(jù)庫打交道的應(yīng)用場景,所以一個應(yīng)用中會存在大量的數(shù)據(jù)庫操作,比如過數(shù)據(jù)庫句柄來連接數(shù)據(jù)庫這一行為,使用單例模式可以避免大量的new操作,因?yàn)槊恳淮蝞ew操作都會消耗內(nèi)存資源和系統(tǒng)資源。

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

使用傳統(tǒng)方式編碼

復(fù)制代碼 代碼如下:

?php

......

//初始化一個數(shù)據(jù)庫句柄

$db = new DB(...);

//比如有個應(yīng)用場景是添加一條用戶信息:

$db-addUserInfo();

......

//然而我們在另外一個地方可能要查找用戶的信息,這個情景出現(xiàn)在一個函數(shù)中,這時要用到數(shù)據(jù)庫句柄資源,我們可能需要這么去做

......

function test(){

......

//這時我們不得不重新初始化一個數(shù)據(jù)庫句柄,試想多個應(yīng)用場景下,這樣的代碼是多么可怕啊?!

$db = new DB(...);

$db-getUserInfo();

......

//有些朋友或許會說,我也可以不這樣做啊,我直接利用global關(guān)鍵字不就可以了嗎?的確,global可以解決問題,也起到了單例模式的作用,但是OOP中,我們拒絕這樣來編寫代碼,因?yàn)間lobal存在安全隱患,請參考相關(guān)書籍,同時單例模式恰恰是對全局變量的一種改進(jìn),避免了那些存儲唯一實(shí)例的全局變量污染命名空間

global $db; //OOP中,我們不提倡這樣編寫代碼

......

}

使用單例模式編碼

復(fù)制代碼 代碼如下:

?php

......

//所有的應(yīng)用情景只有一個數(shù)據(jù)庫句柄資源,嘿嘿,效率老高了,

//資源也大大的得到節(jié)省,代碼簡潔明了:)

DB::getInstance()-addUserInfo();

DB::getInstance()-getUserInfo();

......

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

在了解了單例模式的應(yīng)用場景之后,下面我們通過編寫單例模式的具體實(shí)現(xiàn)代碼來掌握PHP單例模式的核心要點(diǎn),代碼如下:

復(fù)制代碼 代碼如下:

?php

/**

* PHP單例模式演示舉例

* @author guohua.li

* @modify 2010-07-11

* @website

*/

class User{

/**

* 靜態(tài)成品變量 保存全局實(shí)例

* @access private

*/

static private $_instance = NULL;

/**

* 私有化構(gòu)造函數(shù),防止外界實(shí)例化對象

*/

private function __construct() {}

/**

* 私有化克隆函數(shù),防止外界克隆對象

*/

private function __clone(){}

/**

* 靜態(tài)方法, 單例統(tǒng)一訪問入口

* @return object 返回對象的唯一實(shí)例

*/

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!';

}

}

從以上代碼中,我們總結(jié)出PHP單例模式實(shí)現(xiàn)的核心要點(diǎn)有如下三條:

1.需要一個保存類的唯一實(shí)例的靜態(tài)成員變量(通常為$_instance私有變量)

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

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

PHP單例模式的缺點(diǎn)

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


新聞名稱:php數(shù)據(jù)庫使用場景 php中數(shù)據(jù)庫怎么設(shè)計(jì)
鏈接URL:http://weahome.cn/article/doiiidg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部