亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

請大神指教一下!

<?php
class?Car?{
????public?$name?=?'car';
????
????public?function?__clone()?{
????????$obj?=?new?Car();
????????$obj->name?=?$this->name;
????}
}
$a?=?new?Car();
$a->name?=?'new?car';
$b?=?clone?$a;
if?($a?==?$b)?echo?'==';???//true
if?($a?===?$b)?echo?'===';?//false

$str?=?serialize($a);?//對象序列化成字符串
echo?$str.'<br>';
$c?=?unserialize($str);?//反序列化為對象
var_dump($c);

中間的
? ? ? ?$obj = new Car();
? ? ? ?$obj->name = $this->name;
? ? 這兩段有啥用呀,去掉再運行沒有什么不同?

正在回答

2 回答

$a?=?new?Car();??#?$a是對象的引用變量
$b?=?clone?$a;???#?$b是$a對象的shallow?copy(淺拷貝)
??Php和Java一樣,clone函數默認的clone操作都是shallow?copy,并沒有包含在對象中的內部對象。
由于這個矛盾和我們使用clone函數想要實現新創建的對象和舊對象互不影響(淺拷貝會將舊對象內部的引用變量的值--相當于舊對象的內部對象也拷貝到新對象中,而這個新對象也因此擁有了舊對象的內部對象,這樣就有了一塊共同的內存,和我們設計clone的初衷不吻合),因此Php通常會重寫__clone函數,在里面在重新創建一個Car類的對象,然后再操作屬性。
??當然這種區別在本例的這些代碼中體現不出來,因此就會有你的那個問題。事實上必須加上這幾句話,否則后患無窮。


1 回復 有任何疑惑可以回復我~
#1

Scny 提問者

雖然有點不懂。還是謝謝了
2016-02-01 回復 有任何疑惑可以回復我~
#2

晝顏你不懂 回復 Scny 提問者

慢慢學,以后就會完全搞懂的
2016-02-03 回復 有任何疑惑可以回復我~

/*備注:clone函數默認的clone操作都是淺拷貝,共用一塊內存。

設計初衷是用clone函數實現新創建的對象和舊對象互不影響。

因此,需要在__clone里面重新創建一個Car類的對象$c,然后再操作屬性。


深拷貝:賦值時開辟新內存,對其中一個作出改變,不會影響另一個

淺拷貝:賦值時共用一個內存,也就是引用傳遞。

相當于取了一個別名,對其中一個修改,會影響另一個*/


0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
PHP進階篇
  • 參與學習       181921    人
  • 解答問題       2668    個

輕松學習PHP中級課程,進行全面了解,用PHP快速開發網站程序

進入課程

請大神指教一下!

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號