鍍金池/ 問答/PHP  C  網(wǎng)絡(luò)安全/ PHP中的析構(gòu)函數(shù)執(zhí)行順序?yàn)槭裁词菞1憩F(xiàn)

PHP中的析構(gòu)函數(shù)執(zhí)行順序?yàn)槭裁词菞1憩F(xiàn)

php程序結(jié)束時(shí),析構(gòu)函數(shù)的執(zhí)行順序、為什么是先創(chuàng)建的對象最后被執(zhí)行?
而析構(gòu)函數(shù)的觸發(fā)時(shí)機(jī)是一個(gè)Object被銷毀的時(shí)候
在鳥哥博客中看到:

在C語言中, 所有的符號在編譯器都被”替換”掉了.
而在PHP中, 所有的變量都存儲在稱為”符號表”的HastTable結(jié)構(gòu)中. 在解析執(zhí)行的過程中, 依舊保留著”符號”信息
HastTable存放變量的名字和指向?qū)?yīng)zval的指針

這么說的話,PHP在解析執(zhí)行的時(shí)候,似乎還不能證明變量名就存儲在棧內(nèi)存中,難道是zval結(jié)構(gòu)體存放在棧內(nèi)存中?
那么請問,在PHP結(jié)束時(shí),是先釋放所有變量(對象)的zval呢?還是根據(jù)變量表逐一清理變量名和zval
怎么就成了先進(jìn)后出、棧空間的操作呢?

我現(xiàn)在唯一能想到的是:hash表是個(gè)二維數(shù)組,第一層存放各個(gè)變量,第二層存放每個(gè)變量的變量名和zval指針,而C語言的數(shù)組默認(rèn)情況下是存放在??臻g的,PHP程序結(jié)束時(shí),按照這個(gè)棧空間中的內(nèi)容逐一清理,從而導(dǎo)致了我所提的問題
但是感覺我這想法是在根據(jù)結(jié)果推倒原因,很牽強(qiáng),不解,謝謝諸位

回答
編輯回答
撿肥皂

對象是正序添加到符號表中的,在請求結(jié)束清理階段會(huì)反向遍歷符號表,逐一釋放內(nèi)存
php中的變量是存儲在堆內(nèi)存的,內(nèi)核的局部變量是存儲在棧上的
php內(nèi)核的有些地方是模擬棧的操作

2018年1月16日 14:40
編輯回答
故林

真正生成的對象在堆內(nèi)存,指向?qū)ο蟮闹羔樤跅?nèi)存

2017年7月8日 21:56