php的數(shù)組-PHP

php ?-?@amazeUI ?-?2017-02-05 08:41:26

php數(shù)組在zval中的聯(lián)合體中是一個(gè)指針,這個(gè)指針指向的是一張哈希表,這個(gè)哈希表對應(yīng)一個(gè)或多個(gè)zval結(jié)構(gòu)體。比如$a = array('a','b','c');會產(chǎn)生一個(gè)結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體的聯(lián)合體會有一個(gè)指針,指向一張哈希表,這張哈希表存著三條記錄,可以簡單的將哈希表理解為一個(gè)關(guān)聯(lián)數(shù)組,一共有三個(gè)鍵值對,0對應(yīng)著一個(gè)zval結(jié)構(gòu)體的內(nèi)存地址,這個(gè)zval的聯(lián)合體內(nèi)的值為a。

$a = array('a','b','c');

$b = $a;

以上為傳值賦值,會產(chǎn)生幾個(gè)結(jié)構(gòu)體呢,應(yīng)該是四個(gè)結(jié)構(gòu)體,全局的符號表中會有兩條記錄。如果在這兩句后面加上$a[0]=1;內(nèi)存中的這兩個(gè)變量會如何變化呢,這點(diǎn)與普通類型的變量不同。當(dāng)傳值賦值時(shí),有行為會改變結(jié)構(gòu)體的話會分裂,在數(shù)組這里,分裂的僅僅是一張哈希表,也就是說上面三句代碼執(zhí)行,將會多出一張哈希表,這張哈希表是$b的,這個(gè)$b的哈希表中的鍵1和鍵2其實(shí)還是指向的$a的鍵1和鍵2指向的zval的地址,鍵0將重新指向一個(gè)新產(chǎn)生的值為1的zval中。

數(shù)組鍵的引用賦值引發(fā)的一個(gè)現(xiàn)象

$a = array(1,2,3);

$b = &$a[1];

$c = $a;

$a[1] = 5;

echo $c[1];

此時(shí)實(shí)際上輸出的就是5了,因?yàn)?b的引用賦值已經(jīng)將基礎(chǔ)單元值為2的zval結(jié)構(gòu)體的類型改為了引用類型,而php只會去判斷第一層的zval類型,所以導(dǎo)致$a和$c指向的還是同一張符號表。

以上說的符號表是全局符號表,有全局就肯定也有局部,局部符號表指的是程序進(jìn)行過程中遇到的自定義函數(shù)里的變量存放的地方。函數(shù)里的局部符號表就存在函數(shù)的結(jié)構(gòu)體里,函數(shù)中的靜態(tài)變量存放在op_array里,也是一個(gè)指針指向一張符號表。而常量單獨(dú)在整個(gè)內(nèi)存中占用一張符號表。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容