成人精品一区二区三区中文字幕-成人精品一区二区三区-成人精品一级毛片-成人精品亚洲-日本在线视频一区二区-日本在线视频免费

導航首頁 ? 技術教程 ? PHP中的淺復制與深復制的實例詳解
全站頭部文字 我要出現(xiàn)在這里
PHP中的淺復制與深復制的實例詳解 745 2023-12-08   

PHP中的淺復制與深復制的實例詳解

前言:

最近溫習了一下Design Pattern方面的知識,在看到Prototype Pattern這一設計模式時,注意到其中涉及到一個淺復制與深復制的問題。這里來總結(jié)一下,提醒自己以后一定要多加注意。

自PHP5起,new運算符自動返回一個引用,一個 對象變量 已經(jīng)不再保存整個對象的值,只是保存一個標識符來訪問真正的對象內(nèi)容。當對象作為參數(shù)傳遞,作為結(jié)果返回,或者賦值給另外一個變量,另外一個變量跟原來的不是引用的關系,只是他們都保存著同一個標識符的拷貝,這個標識符指向同一個對象的真正內(nèi)容。

這里舉個栗子:

class Example1
{
  public $name;

  public function __construct($name)
  {
    $this->name = $name;
  }
}

$ex1 = new Example('test1');// $ex1->name現(xiàn)在是:test1
$ex2 = $ex1;// $ex2->name現(xiàn)在是:test1

$ex2->name = 'test2';// 這樣修改一下之后,$ex1->name與$ex2->name都變?yōu)榱耍簍est2

通過上面這個例子,應該可以理解對象間引用的概念了,那么我們繼續(xù)往下走,在php中提供了 clone 這個關鍵字來進行對象復制,還是用上面的類來演示一下:

$ex1 = new Example('test1');// $ex1->name現(xiàn)在是:test1
$ex2 = clone $ex1;//$ex2->name現(xiàn)在是:test1

$ex2->name = 'test2';//現(xiàn)在$ex1->name還是test1,而$ex2->name是test2

這里看到,通過clone之后,$ex1與$ex2是兩個不同的對象,他們擁有各自的變量環(huán)境。但是這里需要注意,在這兩個對象內(nèi)部,擁有的是值類型的數(shù)據(jù),如果是內(nèi)部擁有的是引用類型,那么通過clone得到的新對象中的引用則仍然指向原引用。這里就引申出 淺復制 與 深復制 的概念:

淺復制: 使用clone來復制對象,這種復制叫做“淺復制“,被賦值對象的所有變量都還有與原來對象相同的值,而所有的對其他對象的引用都仍然指向原來的對象。

深復制:被復制的對象的所有的變量都含有與原來的對象相同的值,除去那些引用其他對象的變量。

默認使用 clone 是進行一個淺復制,那么如何才能進行深復制呢?

方式一:利用__clone方法

public function __clone()
{
  $this->obj = new Obj();
}

這種方式非常直觀,但是卻有一個很麻煩的操作方式,就是當類中包含多個引用時,你就需要在__clone方法中逐個重新設置。而且還要處理一些循環(huán)引用的問題。是很復雜的。

方式二:利用串行化(冷藏與解凍)

$tmp = serialize($ex1);
$ex2 = unserialize($tmp);

這時候得到的$ex2就是一個全新的對象,這個過程在java中也叫作”冷藏“與”解凍“過程。

序列化是一個遞歸的過程,我們不需要理會被對象內(nèi)部引用了多少個對象以及引用了多少層對象,我們都可以徹底的復制。方式二真的很黃很暴力,但是我很喜歡。

如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


主站蜘蛛池模板: 浙江卫视跑男官网| 孙喆| douyi| 夜半2点钟| 任港秀| 寿比南山一般指多少岁| 超越天堂菲律宾| 韩义生| 吴彦祖激情戏| 电影疯狂之人| 魔法城堡歌词| 黄色污污视频| 在那遥远的地方演员表| 英雄重生| yy五项滚刀骂人套词| 绝情电视剧| 好看图片头像大全| 即便是爸爸也想恋爱| hunger game| 吻戏韩剧| 女神异闻录5动画| 宋元甫| 奇妙的植物世界阅读短文答案| 阿妹的诺言| 赵汉善| 挠胳肢窝肚子腰| 美女自尉视频| 遥远星际| 红电视剧演员表| 人蛇大战 电影| 爷爷的爷爷怎么称呼| 太太的情人 电影| 大奉打更人电视剧在线| 孙启皓| 斯科特阿金斯主演所有电影| 假面骑士01| 成人免费视频视频| 龙的传人第四季| dearestblue动漫免费观看| 漂亮女孩 电视剧| 纵情四海|

!?。≌鹃L長期在線接?。?!

網(wǎng)站、小程序:定制開發(fā)/二次開發(fā)/仿制開發(fā)等

各種疑難雜癥解決/定制接口/定制采集等

站長微信:lxwl520520

站長QQ:1737366103