PHP寫時複製, 變數複製和物件複製不同

2021-09-09 01:40:32 字數 993 閱讀 6409

2023年3月18日 15:09:28 星期五

一直以為php物件也是寫時複製.......

其實: 

php的變數是寫時複製, 物件是引用的

寫時複製: $a = $b; 如果$b的內容不改變, $a和$b指向同一塊記憶體; 如果$b內容改變了, $a的內容是不會改變的, 而是為$b重新申請空間存放資料

但是!!!物件 $objtest1 = $objtest2; 這樣寫, 如果$objtest1或者$objtest2任何乙個變了都會影響到對方

測試**如下

1

<?php

2echo '';

3 //變數複製測試

4$a = 123;

5$b = $a;6

$b = 234;78

var_dump($a, $b); //

int(123) int(234)

9 //物件複製測試

10class

test

1115

16$objtest1 = new

test();

17$objtest2 = $objtest1;18

$objtest2->t = 'objtest2';

19var_dump($objtest1->t, $objtest2->t); //

string(objtest2), sting(objtest2)

2021

$objtest3 = new

test(); //重新new, 而不是賦值

22$objtest3->tt = 'objtest3';

23var_dump($objtest1->tt, $objtest3->tt); //

int(234), sting(objtest3)

解決辦法就是, 使用的時候重新new 或者在類裡邊實現__clone()方法

另外: 放在陣列裡的物件也是全程引用的

finger php 框架

PHP寫時複製(Copy On Write)

從乙個例子說起 foo 1 bar foo echo foo bar 變數 foo 賦值給變數 bar,這兩個變數具有相同的值,沒有必要新申請記憶體空間,他們可以共享同一塊記憶體。在很多場景下php 的 cow 對記憶體進行優化。比如 變數的多次賦值 函式引數傳遞,並在函式體內修改實參等。這是一段摘...

Copy On Write寫時複製

copy on write解決的問題 早期unix系統建立程序的方式存在缺陷 當發出fork 系統呼叫時,核心原樣複製父程序的整個位址空間並把複製的那乙份分配給子程序。這種行為是非常耗時的,因為它需要 為子程序的頁表分配頁幀 為子程序的頁分配頁幀 初始化子程序的頁表 把父程序的頁複製到子程序相應的頁...

Copy On Write 寫時複製

維基百科 寫入時複製 copy on write 是乙個被使用在程式設計領域的最佳化策略。其基礎的觀念是,如果有多個呼叫者 callers 同時要求相同資源,他們會共同取得相同的指標指向相同的資源,直到某個呼叫者 caller 嘗試修改資源時,系統才會真正複製乙個副本 private copy 給該...