微信号:we21cto

介绍:21CTO(21CTO.com)是中国项级技术专家的学习与服务平台.我们为CTO、技术总监、架构师等技术专家提供高质量的资讯、问答、活动等产品,同时与企业连接,提供技术咨询、研发、运维、技术支持、培训及人才招聘等服...

PHP7扩展开发之字符串处理

2016-11-27 22:49 21CTO

本文由淘宝网苍龙(信海龙,21CTO会员)为21CTO社区投稿,本站首发。

PHP的字符串处理函数族很强大,它们的抽象都是由Zend使用C语言来开发的。本文中心思想为开发PHP扩展的字符串篇,欢迎各位关注&分享。

前言

这次,我们来看看字符串在PHP扩展里面如何处理。
示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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扩展源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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新增的结构。结构如下:

1
2
3
4
5
6
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结构专属的方法。主要有如下几个:

1
2
3
4
#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中的相关代码。我们下篇见。


作者:苍龙
来源:信海龙博客(bo56.com)

 
21CTO 更多文章 个性化推荐系统架构设计(三)— 使用爬虫抓取网页与RSS内容 个性化推荐系统(三)— 构建爬虫开发函数基础库 个性化推荐系统(三)— 构建爬虫开发函数基础库 个性化推荐系统架构设计(二):爬虫系统概述 个性化推荐系统架构设计(一)
猜您喜欢 网站被随机挂广告,疑似被 HTTP 劫持 【Android探索之旅】面向对象和Java基础 新书《Storm技术内幕与大数据实践》 使用CSS伪元素模拟float:center效果 估值110亿美元的Pinterest,走的是什么技术范儿?