<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 功能強大 支持多語言、二開方便! 廣告
                ## 前言 這次,我們來看看字符串在PHP擴展里面如何處理。 示例代碼如下: ``` <?php function str_concat($prefix, $string) { $len = strlen($prefix); $substr = substr($string, 0, $len); if ($substr != $prefix) { return $prefix." ".$string; } else { return $string; } } echo str_concat("hello", "word"); echo "\n"; echo str_concat("hello", "hello bo56.com"); echo "\n"; ?> ``` 上面的`str_concat`方法實現了如下功能: 1. 當字符串不包含指定前綴字符串時,把前綴字符串和被檢測字符合并返回。 2. 當字符串包含指定前綴字符串時,原樣返回。 我們將使用PHP擴展的方式實現str_concat功能。 ## 代碼 ### 基礎代碼 這個擴展,我們將在say擴展上增加 `str_concat` 方法。say擴展相關代碼大家請看這篇博文。PHP7擴展開發之hello word 文中已經詳細介紹了如何創建一個擴展和提供了源碼下載。 ### 實現str_concat方法 str_concat方法的PHP擴展源碼: ```c PHP_FUNCTION(str_concat) { zend_string *prefix, *subject, *result; zval *string; if (zend_parse_parameters(ZEND_NUM_ARGS(), "Sz", &prefix, &string) == FAILURE) { return; } subject = zval_get_string(string); if (zend_binary_strncmp(ZSTR_VAL(prefix), ZSTR_LEN(prefix), ZSTR_VAL(subject), ZSTR_LEN(subject), ZSTR_LEN(prefix)) == 0) { RETURN_STR(subject); } result = strpprintf(0, "%s %s", ZSTR_VAL(prefix), ZSTR_VAL(subject)); RETURN_STR(result); } ``` ## 代碼說明 zend_string是PHP7新增的結構。結構如下: ```c struct _zend_string { zend_refcounted_h gc; /*gc信息*/ zend_ulong h; /* hash value */ size_t len; /*字符串長度*/ char val[1]; /*字符串起始地址*/ }; ``` 在[Zend/zend_string.h](https://github.com/php/php-src/blob/master/Zend/zend_string.h)提供了一些zend_string處理的一些方法。 `ZSTR_`開頭的宏方法是`zend_string`結構專屬的方法。主要有如下幾個: ```c #define ZSTR_VAL(zstr) (zstr)->val #define ZSTR_LEN(zstr) (zstr)->len #define ZSTR_H(zstr) (zstr)->h #define ZSTR_HASH(zstr) zend_string_hash_val(zstr) ``` `ZSTR_VAL` 、`ZSTR_LEN ZSTR_H`宏方法分別對應`zend_string`結構的成員。`ZSTR_HASH`是獲取字符串的hash值,如果不存在,就調用hash函數生成一個。 代碼中故意把第二個參數轉換成zval。主要是為了展現zend為我們提供了一系列的操作方法。如,`zval_get_string`, `zend_binary_strncmp`。 這些方法在[Zend/zend_operators.h](https://github.com/php/php-src/blob/master/Zend/zend_operators.h)文件中。 更多宏方法請查看 [Zend/zend_API.h](https://github.com/php/php-src/blob/master/Zend/zend_API.h)中的相關代碼。
                  <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>

                              哎呀哎呀视频在线观看