PHP變數記憶體分配問題

2021-06-19 01:41:53 字數 776 閱讀 8284

今天碰到乙個關於php變數記憶體分配的問題,記錄一下。

如下這段**:

$a = array (

'str' => 1,

'child' => 2

);$b = $a;

$b['child'] = $a;

$b['child']['str'] = 2;

echo $b['str'];

$b = null;

echo $a['str'];

會輸出什麼呢,結果是11,$b=$a的時候其實並沒有新分配記憶體,ab是指向的同乙個區域,$b['child']=$a時,$b會先copy乙份原來$a的內容,然後再修改,也就是說這時候$b和$a指向了不同的區域,再修改$a或者$b的時候都不會互相影響了。

再看這段**:

class a

$a = new a();

$b = $a;

$a->str = 1;

$a->child = 2;

$b->child = $a;

$b->child->str = 2;

echo $b->str;

$b = null;

echo $a->str;

又會輸出什麼呢,結果是22,根據實際情況來判斷,$b->child=$a的時候,並沒有像陣列那樣,重新copy乙份,ab以及a->child都是指向的同一片區域,這樣改任何乙個,其餘幾個都會被改掉。

可是php為啥要設計成這樣呢。

變數記憶體分配

預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中...

變數記憶體分配

變數記憶體分配 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注...

變數的記憶體分配

1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指 令集中,效率很高,但是分配...