賦值時,引用賦值相當於取了一個別名;對其中一個修改會影響另一個。 PHP中賦值時,普通物件是深拷貝,但對物件來說是淺複製。也就是說,物件的賦值是引用賦值。以下介紹一下php物件的淺複製,有需要的可以參考參考。
上週遇到一個低階的bug,半天沒找到問題所在,今天在蹲坑的時候,不知道為何腦子中想起了這個bug, 然後突然意識到是否是因為沒有進行物件clone 造成的。
果然,問題是因為在多次遍歷同一個laravel collection 時,反覆對同一個物件的屬性進行操作,導致後面的操作覆蓋了先前的操作,所以在最終返回結果時,只保留了最後一次的操作結果。
淺複製(shallow copy)
$copy_of_object = clone $object;
來做一個測試
<?php class City { public $name; } $c1 = new City; $c1->name = "烟台"; echo $c1->name; // 烟台 echo PHP_EOL; $c2 = $c1; echo $c2->name; // 烟台 echo PHP_EOL; $c1->name = "威海"; echo $c2->name; // 威海 echo PHP_EOL; $c3 = clone $c1; echo $c3->name; // 威海 echo PHP_EOL; $c1->name = "青岛"; echo $c3->name; // 威海 echo PHP_EOL;
測試結果
php /tmp/test.php 烟台 烟台 威海 威海 威海
為何稱之為淺複製呢?
與之對應的是深複製。因為淺複製情況下,物件的屬性如果還是物件的話,該屬性還是指向同一個物件。
推薦學習:php影片教學
以上是PHP物件如何進行淺複製的詳細內容。更多資訊請關注PHP中文網其他相關文章!