美文网首页
PHP7扩展开发之字符串处理

PHP7扩展开发之字符串处理

作者: 信海龙 | 来源:发表于2016-11-04 15:53 被阅读499次

前言

这次,我们来看看字符串在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; 
    }   
    //提供了zval到zend_string的转换
    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); 
    }   
      
      //内存操作,拼接两个zend_string
    result = zend_string_extend(prefix, ZSTR_LEN(prefix)+ZSTR_LEN(subject)+2, 0); 
    ZSTR_VAL(result)[ZSTR_LEN(prefix)+1] = ' ';
    memcpy(ZSTR_VAL(result)+ZSTR_LEN(prefix)+2, ZSTR_VAL(subject), ZSTR_LEN(subject));
    RETURN_STR(result);
}

代码解读

代码中故意把第二个参数转换成zval。主要是为了展现zend为我们提供了一些列的zval的转换方法。如,zval_get_string。
这些方法在Zend/zend_operators.h文件中。

zend_string是PHP7新增的结构。结构如下:

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

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)

Zend/zend_string.h文件中。ZSTR_VAL ZSTR_LEN ZSTR_H宏方法分别对应zend_string结构的成员。ZSTR_HASH是获取字符串的hash值,如果不存在,就调用hash函数生成一个。

Zend/zend_string.h提供了一些zend_string处理的一些方法。
如代码中的 zend_string_extend。

除此之外,在Zend/zend_operators.h中也提供了一些字符串比较的方法。如 zend_binary_strncmp。

由于Zend引擎并没有提供zend_string拼接的方法,我们只能通过内存操作实现拼接。

更多宏方法请查看 Zend/zend_API.h中的相关代码。
更多函数说明请查看

源码下载

tar.gz格式下载
zip格式下载

相关文章

  • PHP7扩展开发之字符串处理

    前言 这次,我们来看看字符串在PHP扩展里面如何处理。示例代码如下: 上面的str_concat方法实现了如下功能...

  • PHP7扩展开发之类型处理

    前言 这次,我们将演示如何在PHP扩展中如何对类型进行一些操作。如,判断变量类型。要实现的PHP代码如下: 代码 ...

  • 2017年第三届PHP开发者大会总结(三)php-x篇.md

    使用c++11开发php7扩展(韩天峰) 简单说就是天峰在多年的php扩展开发中,感受到基于c的zend api十...

  • ES6基础-ES6的扩展

    进行对字符串扩展,正则扩展,数值扩展,函数扩展,对象扩展,数组扩展。 开发环境准备: 编辑器(VS Code, A...

  • PHP7扩展开发之创建变量

    前言 在这篇博文中我们将演示如何在PHP扩展中创建一个变量。示例代码如下: 中间的三行我们将用PHP扩展来实现。 ...

  • php7字符串底层实现

    本篇为《php7底层设计与源码实现》的读书笔记php7 的字符串以zend_string 为载体,实现字符串的功能...

  • ES6扩展

    字符串扩展 正则扩展 数值扩展 函数扩展 对象扩展 数组扩展 字符串扩展 模版字符串 部分新的方法 padStar...

  • (转)PHP7扩展开发之创建变量

    前言 在这篇博文中我们将演示如何在PHP扩展中创建一个变量。示例代码如下: 'b');$obj =new demo...

  • PHP7安装Memcached扩展

    安装依赖库 libmemcached 安装php7的memcached扩展 启动扩展 修改配置文件 在末尾添加 重...

  • ES6语法——字符串扩展

    字符串扩展内容 如图所示: 1. 字符串中处理 Unicode 字符的方法 2. codePointAt() AP...

网友评论

      本文标题:PHP7扩展开发之字符串处理

      本文链接:https://www.haomeiwen.com/subject/aehwuttx.html