<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 2.5 變量的檢索 用戶在PHP語言里定義的變量,我們能否在內核中獲取到呢? 答案當然是肯定的,下面我們就看如何通過zend_hash_find()函數來找到當前某個作用域下用戶已經定義好的變量。 zend_hash_find()函數是內核提供的操作HashTable的API之一,如果你沒有接觸過,可以先記住怎么使用就可以了。 ````c { 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僅代表這個變量是否存在而已。 ## links * [目錄](<preface.md>) * 2.4 [變量的存儲方式](<2.4.md>) * 2.6 [類型轉換](<2.6.md>)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看