本篇文章給大家分享的是有關(guān)如何在PHP項目中安全的實現(xiàn)一個單例模式,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
成都創(chuàng)新互聯(lián)公司是一家專業(yè)從事網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司。作為專業(yè)網(wǎng)絡(luò)公司,成都創(chuàng)新互聯(lián)公司依托的技術(shù)實力、以及多年的網(wǎng)站運營經(jīng)驗,為您提供專業(yè)的成都網(wǎng)站建設(shè)、網(wǎng)絡(luò)營銷推廣及網(wǎng)站設(shè)計開發(fā)服務(wù)!代碼如下:
class A
{
protected static $_instance = null;
protected function __construct()
{
//disallow new instance
}
protected function __clone(){
//disallow clone
}
public function getInstance()
{
if (self::$_instance === null) {
self::$_instance = new self();
}
return self::$_instance;
}
}
class B extends A
{
protected static $_instance = null;
}
$a = A::getInstance();
$b = B::getInstance();
var_dump($a === $b);
將__construct方法設(shè)為私有,可以保證這個類不被其他人實例化。但這種寫法一個顯而易見的問題是:代碼不能復(fù)用。比如我們在一個一個類繼承A:
復(fù)制代碼 代碼如下:
class B extends A
{
protected static $_instance = null;
}
$a = A::getInstance();
$b = B::getInstance();
var_dump($a === $b);
上面的代碼會輸出:
復(fù)制代碼 代碼如下:
bool(true)
問題出在self上,self的引用是在類被定義時就決定的,也就是說,繼承了B的A,他的self引用仍然指向A。為了解決這個問題,在PHP 5.3中引入了后期靜態(tài)綁定的特性。簡單說是通過static關(guān)鍵字來訪問靜態(tài)的方法或者變量,與self不同,static的引用是由運行時決定。于是簡單改寫一下我們的代碼,讓單例模式可以復(fù)用。
復(fù)制代碼 代碼如下:
class C
{
protected static $_instance = null;
protected function __construct()
{
}
protected function __clone()
{
//disallow clone
}
public function getInstance()
{
if (static::$_instance === null) {
static::$_instance = new static;
}
return static::$_instance;
}
}
class D extends C
{
protected static $_instance = null;
}
$c = C::getInstance();
$d = D::getInstance();
var_dump($c === $d);
以上代碼輸出:
復(fù)制代碼 代碼如下:
bool(false)
這樣,簡單的繼承并重新初始化$_instance變量就能實現(xiàn)單例模式。注意上面的方法只有在PHP 5.3中才能使用,對于之前版本的PHP,還是老老實實為每個單例類寫一個getInstance()方法吧。
以上就是如何在PHP項目中安全的實現(xiàn)一個單例模式,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站名稱:如何在PHP項目中安全的實現(xiàn)一個單例模式-創(chuàng)新互聯(lián)
新聞來源:http://www.rwnh.cn/article46/igeeg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、定制開發(fā)、標(biāo)簽優(yōu)化、網(wǎng)站收錄、網(wǎng)站制作、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容