色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

PHP內核探索 —— 變量的檢索:zend_hash_find()函數

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

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

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

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

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

所以當我們去HashTable里尋找變量的時候,得到的值其實是一個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()函數找到了我們需要的數據,它將返回SUCCESS常量,并把它的地址賦給我們在調用zend_hash_find()函數傳遞的fooval參數,也就是說此時fooval就指向了我們要找的數據。如果沒有找到,那它不會對我們fooval參數做任何修改,并返回FAILURE常量。

就去符號表里找變量而言,SUCCESS和FAILURE僅代表這個變量是否存在而已。

標簽: PHP
相關文章:
主站蜘蛛池模板: 国产欧美日韩精品第一区 | 92精品国产成人观看免费 | 国产毛片久久国产 | 男女交性拍拍拍高清视频 | 亚洲国产系列久久精品99人人 | 日韩美女强理论片 | 国产毛片a | 久久久综合久久 | 国产精品久久国产三级国不卡顿 | 欧美视频第一页 | 欧美日韩加勒比一区二区三区 | 天天澡夜夜澡狠狠澡 | 国产色视频一区二区三区 | 国产欧美一区二区三区视频 | www片| 日韩一区二区三区在线播放 | 久久一区二区三区免费播放 | 国产免费一区二区三区在线 | 韩国一级毛片大全女教师 | 亚洲综合第一页 | 国产黄色小视频在线观看 | 午夜三级理论在线观看视频 | 国产精品国产精品 | 日韩欧美一区二区中文字幕 | 欧美日韩国产亚洲一区二区 | 天堂成人av| 美女视频免费永久观看的 | 免费观看欧美精品成人毛片 | 污美女网站www在线观看 | 精品视频国产狼人视频 | 国产日本欧美在线观看 | 欧美成人免费观看bbb | 999热成人精品国产免 | 欧美叫床戏做爰无遮挡 | 亚欧视频在线 | 中文字幕乱 | 五月天激激婷婷大综合蜜芽 | 久久成人动漫 | 在线播放日韩 | 国产福利片在线 易阳 | 国产亚洲女在线精品 |