资讯专栏INFORMATION COLUMN

php7源码阅读(3)--string函数阅读

xingpingz / 3367人阅读

摘要:在中是常用的类型,今天就开始阅读他的函数,本人小菜,有什么错误的地方望大神指点。首先的函数定义在文件中,这里我看的版本是。

在php中String是常用的类型,今天就开始阅读他的函数,本人小菜,有什么错误的地方望大神指点。

首先string的函数定义在/ext/standard/string.c文件中,这里我看的php版本是php7.1.2。

首先在对于php源码中的函数,定义方法都是PHP_FUNCTION(方法名称)

源码:

strtolower和strtoupper

这两个函数的源码相对比较简单,但是在文件中既出现
PHPAPI char *php_strtoupper(char *s, size_t len)
又出现了
PHPAPI zend_string *php_string_toupper(zend_string *s)
他们代码的主要算法是一样的,但是在定于strtoupper方法处是这样写的
    PHP_FUNCTION(strtoupper)
    {
        zend_string *arg;
    
        ZEND_PARSE_PARAMETERS_START(1, 1)
            Z_PARAM_STR(arg)
        ZEND_PARSE_PARAMETERS_END();
    
        RETURN_STR(php_string_toupper(arg));
    }
所以函数应该是php_string_toupper,至于php_strtoupper,由检索得这个函数可能是为内部一些方法提供的接口

PHPAPI zend_string *php_string_toupper(zend_string *s)
{
    unsigned char *c, *e; //c是字符串的起始位置,e是字符串的结束位置

    c = (unsigned char *)ZSTR_VAL(s);  //返回zeng_tring类型中数据部分val的值,也就是字符串的首地址

    e = c + ZSTR_LEN(s);  //因为是e定义的是指针类型,所以e的地址就是字符串的首地址+字符串长度,也就是""的地址

    //这里使用到了COW,也就是写是拷贝
    while (c < e) {
        if (islower(*c)) {
            register unsigned char *r;
            zend_string *res = zend_string_alloc(ZSTR_LEN(s), 0); //定义res 并为res申请地址空间

            if (c != (unsigned char*)ZSTR_VAL(s)) {  //判断c是否是原始字符串的首地址
                memcpy(ZSTR_VAL(res), ZSTR_VAL(s), c - (unsigned char*)ZSTR_VAL(s));  // 如果c地址不是原始字符串首地址,
                                                                                     //则从原始字符串的首地址开始--->当前c指向的字符串地址,这部分地址数据复制给res
            r = c + (ZSTR_VAL(res) - ZSTR_VAL(s)); //定义开始字符大小转换的标记,也就是从哪个地址开始进行字符串转换
            while (c < e) { //这里就很简单了
                *r = toupper(*c);
                r++;
                c++;
            }
            *r = "";  //定义字符串结束符
            return res;
        }
        c++;
    }
    return zend_string_copy(s); //如果整个字符串没有需要转换的字符,则将字符串的引用计数+1
}
这里需要说明的是,ZSTR_VAL是返回zeng_string结构体类型的数据部分的val值
struct _zend_string {
    zend_refcounted_h gc;
    zend_ulong        h;                /* hash value */
    size_t            len;
    char              val[1];  就是这个值
};

同理 ZSTR_LEN是返回len值


- ###strtolower和strtoupper###  

先暂时写到这里,后续有时间继续补充。。。。。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30800.html

相关文章

  • PHP7 使用资源包裹第三方扩展的实现及其源码解读

    摘要:也就是说该函数的返回值为指针。会将返回值的设为,设为。而这里的则是该函数的返回值,所以后面我们在解析该类型变量时,都需要将带上。 在阅读下面的内容之前,我们假定你已经对 PHP 7 基本的数据结构都有大致的了解了,这是下面内容阅读的前提。 我们分为两大块: 首先实现一个自定义的文件打开、读取、写入、关闭的文件操作扩展; 然后分析各个操作背后的实现原理,其中某些部分的实现我会和 PHP ...

    williamwen1986 评论0 收藏0
  • php7内核阅读(1)--数据容器zval和zend_value

    摘要:本文主要是针对,的话可以移步到庆哥的博客看,还有就是小菜我读的是内核剖析这本书。接下来我会使用到来调试源码本文有参照博客中的部分内容以及代码。 前言 工作+实习快一年了,搞php后端开发,一直很迷茫怎么提高自己,就先从php源码开始吧,本人比较菜,本文章写的比较赶时间,所以有什么错误或者漏掉的地方,望各位大神指正,多交流才能成长嘛,嘿嘿。本文主要是针对php7,php5的话可以移步到庆...

    canger 评论0 收藏0
  • PHP 进阶之路 - PHP7 使用资源包裹第三方扩展的实现

    摘要:释放用于在不同请求中始终存在的永久资源的函数。这是新增的数据结构,在则是。这使得引擎做一些例如资源类型,注册变量等的一次初始化。也就是说该函数的返回值为指针。会将返回值的设为,设为。资源的删除资源删除传入需要被删除的资源即可。 PHP 扩展开发的文章,我均已更新至《TIPI》 在阅读下面的内容之前,我们假定你已经对 PHP 7 基本的数据结构 都有大致的了解了,这是下面内容阅读的前提。...

    caozhijian 评论0 收藏0
  • 我的 2017 —— 一个 PHPer 的自白

    摘要:大会年,我去了。小会值得一提的是,今年月份,我参加了一个的分享会。出游沙巴这是部门组织的出游,获得了最佳团队,拿到了一笔经费,于是有了这次出游。于是,我的下个目的地是西藏。 转眼间 2017 年过去了。我已经不能说自己是去年的毕业生了,时光匆匆,感觉自己越来越老了。 这一年,我所经历的,让我收获很多,让我懂得很多,让我明白了很多。也许是明确了某一个目标,也许是其它的什么,我觉得,201...

    BenCHou 评论0 收藏0
  • 【Redis5源码学习】2019-04-15 简单动态字符串SDS

    摘要:关于结构体内存对齐是什么,请参考源码学习内存管理笔记。这说明在当前情况下,字符串结构中的柔性数组的起始位置并不受是否加关键字而影响,是紧跟在结构体后面的,所以节省内存这个说法并不成立。 baiyan 全部视频:https://segmentfault.com/a/11... 今天我们正式进入redis5源码的学习。redis是一个由C语言编写、基于内存、单进程、可持久化的Key-Va...

    Vixb 评论0 收藏0

发表评论

0条评论

xingpingz

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<