PHP变量内存分配问题记录整理_php技巧
今天碰到一个关于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
{
public $str = '';
public $child;
}
$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为啥要设计成这样呢。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

在PHP開發中,我們常常會遇到PHPNotice:Undefinedvariable的錯誤提示。這個錯誤提示表示我們在程式碼中使用了一個未定義的變數。雖然這個錯誤提示不會導致程式碼崩潰,但是它會影響程式碼的可讀性和可維護性。下面,本文將為大家介紹一些解決這個錯誤的方法。 1.在開發過程中使用error_reporting(E_ALL)函數在PHP開發中,我們可

Java函數中記憶體分配的最佳實踐包括:使用自動記憶體管理,確保使用適當的GC演算法。監控記憶體分配模式,識別記憶體洩漏或瓶頸。使用物件池重複使用相似大小的物件。避免大量短生命週期分配,考慮使用替代方法。使用空物件模式避免建立不需要的物件。明確釋放本機資源,確保釋放JavaGC無法存取的記憶體。

問題:如何分析Go函數的記憶體分配?答案:使用pprof套件中的heapprofile函數產生堆轉儲。分析堆轉儲以確定分配的類型和大小。詳細說明:產生堆轉儲:啟用heap剖析器並呼叫heapprofile函數。分析堆轉儲:使用gotoolpprof指令分析堆轉儲文件,以查看分配資訊。

函數記憶體分配的常見錯誤包括:1)裸指標懸垂;2)記憶體洩漏;3)野指標;4)釋放無效指標。解決方法:1)使用智慧指標;2)使用RAII;3)使用記憶體池。

Golang切片原理深入剖析:記憶體分配與擴容策略引言:切片是Golang中常用的資料型別之一,它提供了便捷的方式來操作連續的資料序列。在使用切片的過程中,了解其內部的記憶體分配與擴容策略對於提高程式的效能十分重要。在本文中,我們將深入剖析Golang切片的原理,並配以具體的程式碼範例。一、切片的記憶體結構和基本原理在Golang中,切片是對底層數組的一種引用類型,

Java堆和棧的區別及應用場景解析,需要具體程式碼範例在Java程式中,堆和棧是兩個常用的資料結構,它們在記憶體中承擔不同的角色和功能。了解堆疊和堆疊的差異對於編寫高效的Java程式至關重要。首先,我們來看看Java堆。堆是一個用來儲存物件的區域,所有在程式中被建立的物件都被儲存在堆中。堆是在程式運行時動態分配和釋放記憶體的地方,它不受任何限制,並且可以根據需要自動

在C++中,函數分配和銷毀記憶體時需要注意陷阱,包括記憶體洩漏(持有已不需要的記憶體指標)和懸空指標(指向已釋放記憶體)。為了防止這些問題,最佳實踐包括:使用智慧指標(如std::shared_ptr)自動管理記憶體;採用RAII技術確保物件超出範圍時釋放資源;避免傳回局部變數的指標;仔細處理析構函數以釋放分配的內存。透過遵循這些實踐,可以確保程式碼的可靠性和防止記憶體洩漏和懸空指標。

Golang是一種物件導向的程式語言,自備垃圾回收機制,因此記憶體分配和回收相較其他語言更容易。在Golang中,函數也是可以分配記憶體和回收記憶體的,本文將對Golang函數的記憶體分配與回收方法進行詳細介紹。一、函數的記憶體分配當函數被宣告時,程式會為其分配一段記憶體用於儲存這個函數的程式碼和靜態變數。當函數被呼叫時,程式會為其分配一塊堆疊記憶體用於儲存該次呼叫的局部變
