<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 前言 這次,我們將演示如何在PHP擴展中定義一個常量。要實現的PHP代碼如下: ``` <?php define("__ARR__", array('2', 'site'=>"www.bo56.com")); define("__SITE__", "www.bo56.com", true); define("say\__SITE__", "bo56.com"); var_dump(__ARR__); var_dump(__site__); var_dump(say\__SITE__); ?> ``` 我們將演示在PHP擴展中定義三個常量。如上面代碼中的三個define。 ## 代碼 ### 基礎代碼 這個擴展,我們將在say擴展的 PHP_MINIT_FUNCTION(say) 方法上增加相應的代碼。say擴展相關代碼大家請看這篇博文。PHP7擴展開發之hello word 文中已經詳細介紹了如何創建一個擴展和提供了源碼下載。 增加的代碼如下 ```c //增加兩個方法 //釋放hash static void say_hash_destroy(HashTable *ht) zend_string *key; zval *element; if (((ht)->u.flags & HASH_FLAG_INITIALIZED)) { ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, element) { if (key) { free(key); } switch (Z_TYPE_P(element)) { case IS_STRING: free(Z_PTR_P(element)); break; case IS_ARRAY: say_hash_destroy(Z_ARRVAL_P(element)); break; } } ZEND_HASH_FOREACH_END(); free(HT_GET_DATA_ADDR(ht)); } free(ht); } //釋放數組和字符串 static void say_entry_dtor_persistent(zval *zvalue) if (Z_TYPE_P(zvalue) == IS_ARRAY) { say_hash_destroy(Z_ARRVAL_P(zvalue)); } else if (Z_TYPE_P(zvalue) == IS_STRING) { zend_string_release(Z_STR_P(zvalue)); } } //PHP_MINIT_FUNCTION(say)方法的PHP擴展源碼: 擴展初始化的調用此方法 PHP_MINIT_FUNCTION(say) { zend_constant c; zend_string *key; zval value; ZVAL_NEW_PERSISTENT_ARR(&c.value); zend_hash_init(Z_ARRVAL(c.value), 0, NULL, (dtor_func_t)say_entry_dtor_persistent, 1); add_index_long(&c.value, 0, 2); key = zend_string_init("site", 4, 1); ZVAL_STR(&value, zend_string_init("www.bo56.com", 12, 1)); zend_hash_update(Z_ARRVAL(c.value), key, &value); c.flags = CONST_CS|CONST_PERSISTENT; c.name = zend_string_init("__ARR__", 7, 1); c.module_number = module_number; zend_register_constant(&c); REGISTER_STRINGL_CONSTANT("__SITE__", "www.bo56.com", 12, CONST_PERSISTENT); REGISTER_NS_STRINGL_CONSTANT("say", "__SITE__", "bo56.com", 8, CONST_CS|CONST_PERSISTENT); } //擴展卸載的時候調用此方法 PHP_MSHUTDOWN_FUNCTION(say) { zval *val; val = zend_get_constant_str("__ARR__", 7); say_hash_destroy(Z_ARRVAL_P(val)); ZVAL_NULL(val); return SUCCESS; } ``` ### 代碼說明 一般情況下,在擴展中只建議定義null,bool,long,double,string幾種類型的常量。因為內核只提供了這幾種類型的宏方法。 常量定義的宏方法在Zend/zend_constants.h文件中。想定義一個常量,很簡單,只要調用對應的宏方法即可。如: ```c REGISTER_STRINGL_CONSTANT("__SITE__", "www.bo56.com", 12, CONST_PERSISTENT); ``` 宏方法的最后一個參數是一些標識符。 * `CONST_PERSISTENT` 表示為持久的。常駐內存。 * `CONST_CS` 表示為區分大小寫。 注意我們上面定義常量時使用的是`__SITE__`,但是調用的時候使用的是`__site__`。 還有一套可以指定命名空間的宏方法。宏方法中帶NS。如: ```c REGISTER_NS_STRINGL_CONSTANT("say", "__SITE__", "bo56.com", 8, CONST_CS|CONST_PERSISTENT); ``` 第一個參數就是命名空間。 為了展示常量定義的一些細節。我們定義了一個`__ARR__`常量。 `ZVAL_NEW_PERSISTENT_ARR(&c.value);`我們想讓__ARR__為持久的。所以使用`ZVAL_NEW_PERSISTENT_ARR`創建一個數組。 數組創建完后,我們需要初始化。初始化的代碼就是 ```c zend_hash_init(Z_ARRVAL(c.value), 0, NULL, (dtor_func_t)say_entry_dtor_persistent, 1); ``` 參數中的`say_entry_dtor_persistent`是一個析構函數,用于釋放數組的元素。 到這里,如果編譯運行。當程序執行結束的時候,你會發現一個致命錯誤。錯誤信息如下: ``` Fatal error: Internal zval's can't be arrays, objects or resources in Unknown on line 0 ``` 因為在程序執行完畢,內部zval釋放的時候,會進行類型檢測。如果發現是`array object`或者`resources`,則會報錯。可以查看[Zend/zend_variables.c](https://github.com/php/php-src/blob/master/Zend/zend_variables.h)文件中`_zval_internal_dtor`方法。 為了解決這個問題,我們需要手動釋放我們創建的`__ARR__`相關的數組。 模塊卸載時執行的方法,是優先Zend內部zval釋放方法之前調用的。因此,我們只要在`PHP_MSHUTDOWN_FUNCTION(say)`方法中手動釋放。不再讓Zend去釋放就可以解決了。
                  <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>

                              哎呀哎呀视频在线观看