標籤:

在php中,new一個對象和clone一個對象,他們之間有什麼不同?

比如現在有一個類
class Person{
function demo (){
return "ok!";
}
}
$one = new Person();
$two = new Person();
----------------------------
$one = new Person();
$two = clone $one;
上面這兩種方式有什麼區別?在不涉及靜態變數和重新賦值的情況下。求詳細解釋,最好說下底層的東西。


class foo {
public $bar = php;
}
$foo = new foo();
// 我的理解:
$a = $foo; // 標識符賦值(把$a賦值為null,原來的$foo並不會變成null,但通過$a能夠修改$foo的成員$bar)
$a = $foo; // 引用賦值(把$a賦值為null,原來的$foo也會跟著變成null)
$a = clone $foo; // 值賦值(賦值後互不影響,很好理解)


題主的例子沒有區別。但是兩者是有區別的。clone直接從對象複製一份副本。不觸發construct函數,就是clone不再類初始化。而new,就是類初始化。舉個例子,new就是出生的嬰兒,然後初始化,體重八斤,叫牛二,成為具體的對象(人)。而克隆就是直接複製具體對象,比如勇士隊複製五個庫里,就不會再初始化,從0歲,三斤九兩開始。而是複製的2017年的庫里。


我來寫一點,clone的對象不執行__construct里的方法,用的時候要注意


就樓主例子來說,應該是沒有區別。不是樓上說的一個變另一個也變。obj1=obj2這樣直接賦值才會一個變另一個也變。但是clone在一些複雜情況下會出現一個變另一個也變的情況,例如構造函數中傳遞new對象等,這時就需要用魔術函數__clone()來規划具體怎麼顯示。


第一種是$one和$two沒有關係,第二種兩者只是名字不同,一個改變另一個也會改變


你要先new對象才能clone,一個是實例化,一個是克隆


推薦閱讀:

輕鬆搞定|將PHP和Couchbase應用部署為Docker
PHP擴展(extensions)
不喜歡 PHP 的兩個點
對於網站開發新手,是應該先把 HTML、CSS 學通後再學 PHP 還是應該先了解一些前端知識然後學習 PHP 呢?
性能測試(上篇)

TAG:PHP | PHP學習 |