當(dāng)然是重新連接了,你是跳轉(zhuǎn)不是包含。
創(chuàng)新互聯(lián)建站總部坐落于成都市區(qū),致力網(wǎng)站建設(shè)服務(wù)有網(wǎng)站制作、成都做網(wǎng)站、網(wǎng)絡(luò)營(yíng)銷策劃、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站維護(hù)、公眾號(hào)搭建、重慶小程序開發(fā)公司、軟件開發(fā)等為企業(yè)提供一整套的信息化建設(shè)解決方案。創(chuàng)造真正意義上的網(wǎng)站建設(shè),為互聯(lián)網(wǎng)品牌在互動(dòng)行銷領(lǐng)域創(chuàng)造價(jià)值而不懈努力!
跳轉(zhuǎn)兩者之間共享值要專門的傳值操作,cookie\
session\
POST/GET
\靜態(tài)輸出
單例模式
:使得類的一個(gè)對(duì)象成為系統(tǒng)中的唯一實(shí)例.
PHP中使用單例模式最常見的就是數(shù)據(jù)庫(kù)操作了。避免在系統(tǒng)中有多個(gè)連接數(shù)據(jù)庫(kù)的操作,浪費(fèi)系統(tǒng)資源的現(xiàn)象,就可以使用單例模式。每次對(duì)數(shù)據(jù)庫(kù)操作都使用一個(gè)實(shí)例。
簡(jiǎn)單示例
class
AClass
{
//
用來(lái)存儲(chǔ)自己實(shí)例
public
static
$instance;
//
私有化構(gòu)造函數(shù),防止外界實(shí)例化對(duì)象
private
function
__construct()
{}
//
私有化克隆函數(shù),防止外界克隆對(duì)象
private
function
__clone()
{}
//
靜態(tài)方法,單例訪問(wèn)統(tǒng)一入口
public
static
function
getInstance()
{
if
(!(self::$instance
instanceof
self)){
self::$instance
=
new
self();
}
return
self::$instance;
}
//
test
public
function
test()
{
return
"done";
}
//
私有化克隆函數(shù),防止外界克隆對(duì)象
private
function
__clone()
{}
}
class
BClass
extends
AClass{
}
//
獲取實(shí)例
$aclass
=
AClass::getInstance();
$bclass
=
BClass::getInstance();
//
調(diào)用方法
echo
$aclass-test();
對(duì)一些比較大型的應(yīng)用來(lái)說(shuō),可能連接多個(gè)數(shù)據(jù)庫(kù),那么不同的數(shù)據(jù)庫(kù)公用一個(gè)對(duì)象可能會(huì)產(chǎn)生問(wèn)題,比如連接句柄的分配等,我們可以通過(guò)給$instance變成數(shù)組,通過(guò)不同的參數(shù)來(lái)控制
簡(jiǎn)單示例
class
DB
{
//
用來(lái)存儲(chǔ)自己實(shí)例
public
static
$instance
=
array();
public
$conn;
//
私有化構(gòu)造函數(shù),防止外界實(shí)例化對(duì)象
private
function
__construct($host,
$username,
$password,
$dbname,
$port)
{
$this-conn
=
new
mysqli($host,
$username,
$password,
$dbname,
$port);
}
//
靜態(tài)方法,單例訪問(wèn)統(tǒng)一入口
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);#實(shí)例化
}
return
self::$instance[$key];
}
//query
public
function
query($ql)
{
return
$this-conn-query($sql);
}
//
私有化克隆函數(shù),防止外界克隆對(duì)象
private
function
__clone()
{}
//釋放資源
public
function
__destruct(){
$this-conn-close();
}
}
PHP單例模式,就是一個(gè)對(duì)象只被生成一次,但該對(duì)象可以被其它眾多對(duì)象使用。單例模式使用最多的場(chǎng)景,是數(shù)據(jù)庫(kù)連接操作。我們知道,生成一個(gè)對(duì)象的操作是用new函數(shù)來(lái)實(shí)現(xiàn),但是new對(duì)象都會(huì)消耗內(nèi)存,而且有時(shí)候?qū)ν粋€(gè)對(duì)象,在不同文件中可能會(huì)生成多次,這就造成了系統(tǒng)資源的浪費(fèi)。然而使用單例模式,則可以很好的避免這種情況。
以數(shù)據(jù)庫(kù)為例,假設(shè)我們有一個(gè)數(shù)據(jù)庫(kù)的類,要實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接。如果不使用單例模式,那么在很多PHP文件中,我們可能到要?jiǎng)?chuàng)建這樣的一個(gè)連接,這其實(shí)是對(duì)資源的很大浪費(fèi)。那么下面介紹單例模式實(shí)現(xiàn)方法:
class?Database
{
//定義一個(gè)屬性,該屬性是靜態(tài)的保護(hù)或私有屬性
protected?static?$db;
//這里構(gòu)造函數(shù)一定要是私有方法
private?function?__construct()
{??
}
//聲明一個(gè)獲取類實(shí)例的方法
static?function?getInstace()
{??
if(self::$db)?{
return?self::$db;
}else?{
//生成自己
self::$db?=?new?self();
return?self::$db;
}??
}
}
//錯(cuò)誤調(diào)用方法
//用new實(shí)例化private標(biāo)記構(gòu)造函數(shù)的類會(huì)報(bào)錯(cuò)
$db?=?new?Database();
//正確獲取實(shí)例方法
$db?=?Database::getInstace();
使用單例模式的好處是,當(dāng)你在其他地方也要使用到這個(gè)類,比如上面的數(shù)據(jù)庫(kù)類。那么你可以在其它地方直接調(diào)用?Database::getInstace(),而且該實(shí)例只會(huì)被生成一次,不會(huì)被重復(fù)生成,所以不會(huì)浪費(fèi)系統(tǒng)資源。
簡(jiǎn)單的說(shuō),單例模式生成的實(shí)例只被生成一次,而且只負(fù)責(zé)一個(gè)特定的任務(wù)。
使用單例模式有下面幾個(gè)要求:
1.構(gòu)造函數(shù)需要標(biāo)記為private(訪問(wèn)控制:防止外部代碼使用new操作符創(chuàng)建對(duì)象),單例類不能在其他類中實(shí)例化,只能被其自身實(shí)例化;
2.擁有一個(gè)保存類的實(shí)例的靜態(tài)成員變量;
3.擁有一個(gè)訪問(wèn)這個(gè)實(shí)例的公共的靜態(tài)方法(常用getInstance()方法進(jìn)行實(shí)例化單例類,通過(guò)instanceof操作符可以檢測(cè)到類是否已經(jīng)被實(shí)例化);
4.如果嚴(yán)謹(jǐn)?shù)脑?,還需要?jiǎng)?chuàng)建__clone()方法防止對(duì)象被復(fù)制(克隆)。(我上面沒創(chuàng)建)
使用單例模式好處,總結(jié):
1、php的應(yīng)用主要在于數(shù)據(jù)庫(kù)應(yīng)用, 所以一個(gè)應(yīng)用中會(huì)存在大量的數(shù)據(jù)庫(kù)操作, 使用單例模式, 則可以避免大量的new 操作消耗的資源。
2、如果系統(tǒng)中需要有一個(gè)類來(lái)全局控制某些配置信息, 那么使用單例模式可以很方便的實(shí)現(xiàn). 這個(gè)可以參看ZF的FrontController部分。
3、在一次頁(yè)面請(qǐng)求中, 便于進(jìn)行調(diào)試。
參考: