·
作者: laruence()
·
: ·
我們經常採用如下方式定義單列:
1.
class
singleton
8.
9.
/**
不容許深度複製*/
10.
private
function
__clone()
12.
13.
public
static
function
getinstance()
17.
18.
return
self::
$instance;
19. }
20. }
很多人都會記得對深度
copy
的保護, 但,
其實我們卻疏忽了一點:
1.
<?php
2.
$a= singleton::getinstance
();
3. $b=
unserialize
(serialize($a
));
4.
5.
var_dump($a
===$b);
6.
//bool(false) 呵呵
, 可見還需要修補
, 加上對序列化的保護:
1.
class
singleton
8.
9.
/**
不容許深度複製*/
10.
private
function
__clone()
12.
13.
/**
不容許serialize */
14.
private
function
__sleep()
16.
17.
/**
不容許unserialize */
18.
private
function
__wakeup()
20.
21.
public
static
function
getinstance()
25.
26.
return
self::
$instance;
27. }
28. }
然而,
有的時候我們是希望我們的單利類是能序列化的
, 這個時候可以考慮如下的方式:
1.
class
singleton
8.
9.
/**
不容許深度複製*/
10.
private
function
__clone()
12.
13.
public
function
__wakeup()
16.
17.
/**
需要在單利切換的時候做清理工作*/
18.
public
function
__destruct()
21.
22.
public
static
function
getinstance()
26.
27.
return
self::
$instance;
28. }
29. }
請注意上面
, 我們在
wakeup
的時候,
切換了當前的單例例項
, 來實現在序列化
/反序列化的時刻保證單例.
另外,
對於一些包含全域性資源的單例類
, 我們需要定義析構函式
, 來在切換的過程中做資源**工作.
現在,
請大家仔細看看
, 然後想想這段**有沒有什麼問題?
接著往下看
, 這段**在有些條件下
, 可能會達不到我們預期的目標
, 比如:
1.
$a= singleton::getinstance
();
2. $a=
unserialize
(serialize($a
));
3.
4.
var_dump($a
=== singleton::getinstance
());
5.
//bool(false)
Serialize Unserialize破壞單例
我們經常採用如下方式定義單例 class singleton 不容許深度複製 private function clone public static function getinstance return self instance 很多人都會記得對深度copy的保護,但,其實我們卻疏忽了一點 a...
單例模式,解決單例破壞。
破壞單例模式的三種方法 執行緒安全情況下 單例模式有 3 個特點 單例類只有乙個例項物件 該單例物件必須由單例類自行建立 單例類對外提供乙個訪問該單例的全域性訪問點。單例模式的優點和缺點 單例模式的優點 單例模式可以保證記憶體裡只有乙個例項,減少了記憶體的開銷。可以避免對資源的多重占用。單例模式設定...
C 反射破壞單例
單例大家都不陌生,程式從開啟到死亡過程中只能存在乙個例項,即存在不可建立,今天給大家介紹一種打破這種模式的方法,在程式執行中建立無數個單例例項物件。關於單例模式模糊或者不懂的可以參考c 單例模式 上文我們講到了反射的基本操作,例項化物件 屬性 方法 特性等操作,可以參考c 反射 咱們切入正題,單例有...