PHP7擴展開發之字符串處理


前言

這次,我們來看看字符串在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擴展源碼:

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新增的結構。結構如下:

struct _zend_string { zend_refcounted_h gc; /*gc信息*/ zend_ulong h; /* hash value */ size_t len; /*字符串長度*/ char val[1]; /*字符串起始地址*/ }; 

Zend/zend_string.h提供了一些zend_string處理的一些方法。
ZSTR_開頭的宏方法是zend_string結構專屬的方法。主要有如下幾個:

#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文件中。

更多宏方法請查看 Zend/zend_API.h中的相關代碼。

更多PHP相關技術請搜索千鋒PHP,做真實的自己,用良心做教育。
互聯網+時代,時刻要保持學習,攜手千鋒PHP,Dream It Possible。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM