国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

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

瀏覽:66日期: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
相關文章:
主站蜘蛛池模板: 国产原创系列在线 | 国产成人精品男人的天堂网站 | 亚洲 欧美 日韩 丝袜 另类 | 精品欧美一区二区三区四区 | 国产精品免费_区二区三区观看 | 欧美日韩免费播放一区二区 | 亚洲一级在线观看 | 国产三级日本三级美三级 | 日本免费一区二区三区三州 | 天天草综合 | 伊人色综合久久天天网蜜月 | 国产成人精品久久 | 亚洲精品午夜一区二区在线观看 | 在线视频一区二区三区 | 美女性视频网站 | 国产极品喷水视频jk制服 | 日韩精品福利视频一区二区三区 | 福利视频99 | 99视频精品全部在线播放 | 色网站在线 | 久久国内视频 | 国产成人综合在线 | 欧美生活片在线 | 国产成人精品免费视频大全办公室 | 免费国产成人手机在线观看 | 成人欧美一区二区三区视频 | 成人毛片免费观看视频大全 | 精品自拍一区 | 亚洲精品一二区 | 免费视频一区二区三区四区 | 美国黑人特大一级毛片 | 亚洲 欧美 国产 日韩 制服 bt | 亚洲国产国产综合一区首页 | 国产精品人成 | 久久精品8 | 久久久久国产一级毛片高清板 | 热99re久久精品精品免费 | 99国产精品热久久久久久夜夜嗨 | 美国一级做a一级视频 | 亚洲精品国产精品国自产观看 | 欧美一区中文字幕 |