Serialize Unserialize破壞單例

2021-07-04 20:07:19 字數 2765 閱讀 1657

·        

作者: 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 反射 咱們切入正題,單例有...