php 扩展 返回字符串,基于PHP7的PHP扩展开发之四(字符串的处理)
目的:熟悉字符串在PHP擴(kuò)展里面如何處理
要實(shí)現(xiàn)的PHP代碼如下:
1、當(dāng)字符串不包含指定前綴字符串時(shí),把前綴字符串和被檢測(cè)字符合并返回。
2、當(dāng)字符串包含指定前綴字符串時(shí),原樣返回。 我們將使用PHP擴(kuò)展的方式實(shí)現(xiàn)str_concat功能。
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 lostphp.com");
echo "\n";
?>
基礎(chǔ)代碼
在myecho擴(kuò)展上增加 str_concat 方法。
實(shí)現(xiàn)str_concat方法
str_concat方法的PHP擴(kuò)展源碼:
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);
}
找到PHP_FE_END
在上面增加
PHP_FE(str_concat, NULL)
代碼說明
zend_string是PHP7新增的結(jié)構(gòu)。結(jié)構(gòu)如下:
[codee]
struct _zend_string {
zend_refcounted_h gc; /*gc信息*/
zend_ulong h; /* hash value */
size_t len; /*字符串長度*/
char val[1]; /*字符串起始地址*/
};
[/codee]
在Zend/zend_string.h提供了一些zendstring處理的一些方法。 “ZSTR“開頭的宏方法是zend_string結(jié)構(gòu)專屬的方法。主要有如下幾個(gè):
[codee]
#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)
[/codee]
ZSTR_VAL ZSTR_LEN ZSTR_H宏方法分別對(duì)應(yīng)zend_string結(jié)構(gòu)的成員。ZSTR_HASH是獲取字符串的hash值,如果不存在,就調(diào)用hash函數(shù)生成一個(gè)。
代碼中故意把第二個(gè)參數(shù)轉(zhuǎn)換成zval。主要是為了展現(xiàn)zend為我們提供了一些列的操作方法。如,zval_get_string, zend_binary_strncmp。 這些方法在Zend/zend_operators.h文件中。
更多宏方法請(qǐng)查看 Zend/zend_API.h中的相關(guān)代碼。
編譯生成擴(kuò)展 參考《基于PHP7的PHP擴(kuò)展開發(fā)之一(hello word)》
測(cè)試
echo str_concat("hello", "word");
echo "\n";
echo str_concat("hello", "hello lostphp.com");
echo "\n";
輸出
hello word
hello lostphp.com
總結(jié)
以上是生活随笔為你收集整理的php 扩展 返回字符串,基于PHP7的PHP扩展开发之四(字符串的处理)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python微信语音转发方法_微信语音转
- 下一篇: arm之mmu原理