久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

PHP內(nèi)核探索 —— 變量的檢索:zend_hash_find()函數(shù)

瀏覽:92日期:2022-09-16 14:52:28

用戶在PHP語(yǔ)言里定義的變量,我們能否在內(nèi)核中獲取到呢?答案當(dāng)然是肯定的,下面我們就看如何通過(guò)zend_hash_find()函數(shù)來(lái)找到當(dāng)前某個(gè)作用域下用戶已經(jīng)定義好的變量。zend_hash_find()函數(shù)是內(nèi)核提供的操作HashTable的API之一,如果你沒(méi)有接觸過(guò),可以先記住這么使用就可以了。

{ zval **fooval; if (zend_hash_find( EG(active_symbol_table), //這個(gè)參數(shù)是地址,如果我們操作全局作用域,則需要&EG(symbol_table) 'foo', sizeof('foo'), (void**)&fooval ) == SUCCESS ) {php_printf('成功發(fā)現(xiàn)$foo!'); } else {php_printf('當(dāng)前作用域下無(wú)法發(fā)現(xiàn)$foo.'); }}

首先我們定義了一個(gè)指向指針的指針,然后通過(guò)zend_hash_find去EG(active_symbol_table)作用域下尋找名稱為foo($foo)的變量,如果成功找到,此函數(shù)將返回SUCCESS。看完代碼,你肯定有很多疑問(wèn)。為什么還要進(jìn)行sizeof('foo')運(yùn)算,fooval明明是zval**型的,為什么轉(zhuǎn)成void**的?而且為什么還要進(jìn)行&fooval運(yùn)算,fooval本身不就已經(jīng)是指向指針的指針了嗎?:-),該回答的問(wèn)題確實(shí)很多,不要過(guò)于擔(dān)心,讓我們帶著這些問(wèn)題繼續(xù)往下走。

首先要說(shuō)明的是,內(nèi)核定義HashTable這個(gè)結(jié)構(gòu),并不是單單用來(lái)儲(chǔ)存PHP語(yǔ)言里的變量的,其它很多地方都在應(yīng)用HashTable(這就是個(gè)神器)。一個(gè)HashTable有很多元素,在內(nèi)核里叫做bucket。然而每個(gè)bucket的大小是固定的,所以如果我們想在bucket里存儲(chǔ)任意數(shù)據(jù)時(shí),最好的辦法便是申請(qǐng)一塊內(nèi)存保存數(shù)據(jù),然后在bucket里保存它的指針。以zval *foo為例,內(nèi)核會(huì)先申請(qǐng)一塊足夠保存指針內(nèi)存來(lái)保存foo,比如這塊內(nèi)存的地址是p,也就是p=&foo,并在bucket里保存p,這時(shí)我們便明白了,p其實(shí)就是zval**類型的。至于bucket為什么保存zval**類型的指針,而不是直接保存zval*類型的指針,我們到下一章在詳細(xì)敘述。

所以當(dāng)我們?nèi)ashTable里尋找變量的時(shí)候,得到的值其實(shí)是一個(gè)zval的指針。In order to populate that pointer into a calling function’s local storage, the calling function will naturally dereference the local pointer, resulting in a variable of indeterminate type with two levels of indirection (such as void**). Knowing that your 'indeterminate type' in this case is zval*, you can see where the type being passed into zend_hash_find() will look different to the compiler, having three levels of indirection rather than two. This is done on purpose here so a simple typecast is added to the function call to silence compiler warnings.

如果zend_hash_find()函數(shù)找到了我們需要的數(shù)據(jù),它將返回SUCCESS常量,并把它的地址賦給我們?cè)谡{(diào)用zend_hash_find()函數(shù)傳遞的fooval參數(shù),也就是說(shuō)此時(shí)fooval就指向了我們要找的數(shù)據(jù)。如果沒(méi)有找到,那它不會(huì)對(duì)我們fooval參數(shù)做任何修改,并返回FAILURE常量。

就去符號(hào)表里找變量而言,SUCCESS和FAILURE僅代表這個(gè)變量是否存在而已。

標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 亚洲精品一区二区另类图片 | 麻豆freexxxx性91精品 | 天堂久久久久久 | 色婷婷基地 | 91亚洲精品视频 | 四虎免费紧急入口观看 | 欧美人体一区二区三区 | 欧美不卡一区二区三区 | 性欧美大战久久久久久久免费观看 | 羞羞视频免费在线观看 | 国产免费一区二区三区 | 日韩在线视频精品 | 成人精品一区 | 免费国产一区二区 | 国产成人精品一区二区三区视频 | 天堂av中文字幕 | 羞羞视频免费观 | 中国大陆高清aⅴ毛片 | 国产综合久久久久久鬼色 | 久久精品1 | 黄色激情网站 | 国产成人在线电影 | 午夜免费视频 | 久久一区| 91se在线 | 波多野结衣一区二区三区四区 | 免费一级片 | 日韩欧美视频 | 久草在线视频免费播放 | www..99re| 久久精品美女 | 天天舔天天干天天操 | 在线观看国产小视频 | 一级毛片免费 | 超碰天堂 | 日韩一日 | 国产精品久久久久久久久久久久 | 无码一区二区三区视频 | 91av在| 中文字幕在线视频网站 | 久久精品亚洲精品 |