网络科技

    今日:1211| 主题:246121
收藏本版
互联网、科技极客的综合动态。

[其他] PHP7扩展开发之字符串处理

[复制链接]
三年痛七年痒 发表于 2016-11-27 22:50:25
29 6

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

  前言

    这次,我们来看看字符串在PHP扩展里面如何处理。
    示例代码如下:
   
  1. <?php
  2. function str_concat($prefix, $string) {
  3.     $len = strlen($prefix);
  4.     $substr = substr($string, 0, $len);
  5.     if ($substr != $prefix) {
  6.         return $prefix." ".$string;
  7.     } else {
  8.         return $string;
  9.     }   
  10. }
  11. echo str_concat("hello", "word");
  12. echo "\n";
  13. echo str_concat("hello", "hello bo56.com");
  14. echo "\n";
  15. ?>
复制代码
   上面的str_concat方法实现了如下功能:
    1、当字符串不包含指定前缀字符串时,把前缀字符串和被检测字符合并返回。
    2、当字符串包含指定前缀字符串时,原样返回。
    我们将使用PHP扩展的方式实现str_concat功能。
    代码

  基础代码

  这个扩展,我们将在say扩展上增加    str_concat方法。say扩展相关代码大家请看这篇博文。    PHP7扩展开发之hello word文中已经详细介绍了如何创建一个扩展和提供了源码下载。  
  实现str_concat方法

  str_concat方法的PHP扩展源码:
  1. PHP_FUNCTION(str_concat)
  2. {
  3.     zend_string *prefix, *subject, *result;
  4.     zval *string;
  5.     if (zend_parse_parameters(ZEND_NUM_ARGS(), "Sz", &prefix, &string) == FAILURE) {
  6.        return;
  7.     }   
  8.    
  9.     subject = zval_get_string(string);
  10.     if (zend_binary_strncmp(ZSTR_VAL(prefix), ZSTR_LEN(prefix), ZSTR_VAL(subject), ZSTR_LEN(subject), ZSTR_LEN(prefix)) == 0) {
  11.         RETURN_STR(subject);
  12.     }   
  13.     result = strpprintf(0, "%s %s", ZSTR_VAL(prefix), ZSTR_VAL(subject));
  14.     RETURN_STR(result);
  15. }
复制代码
代码说明

  zend_string是PHP7新增的结构。结构如下:
  1. struct _zend_string {
  2.         zend_refcounted_h gc; /*gc信息*/
  3.         zend_ulong        h;  /* hash value */
  4.         size_t            len; /*字符串长度*/
  5.         char              val[1]; /*字符串起始地址*/
  6. };
复制代码
   在      Zend/zend_string.h提供了一些zend_string处理的一些方法。   
          ZSTR_开头的宏方法是zend_string结构专属的方法。主要有如下几个:   
   
  1. #define ZSTR_VAL(zstr)  (zstr)->val
  2. #define ZSTR_LEN(zstr)  (zstr)->len
  3. #define ZSTR_H(zstr)    (zstr)->h
  4. #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中的相关代码。
    更多函数说明请查看    源码下载
友荐云推荐




上一篇:监测宝宝是否尿裤子了,这款名叫CloudTot 的婴儿摇篮去年卖掉一千万台 ...
下一篇:第101期
酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。

宾周樱楚 发表于 2016-11-27 23:28:58
现在整个人都不好了
回复 支持 反对

使用道具 举报

;.l;mklmkmm 发表于 2016-11-27 23:32:33
吾表兄,年四十余.始从文,连考三年而不中.遂习武,练武场上发一矢,中鼓吏,逐之出.改学医,自撰一良方,服之,卒.
回复 支持 反对

使用道具 举报

yayayqy 发表于 2016-11-28 00:06:10
此贴必火,果断抱大腿。
回复 支持 反对

使用道具 举报

ckqvr 发表于 2016-11-28 00:08:23
太高深了,理解力不够用了!
回复 支持 反对

使用道具 举报

A时代ceo 发表于 2016-11-28 00:12:12
在哪里跌倒就在哪里躺下!
回复 支持 反对

使用道具 举报

何志伟 发表于 2016-11-28 17:24:06
上火,就容易缺经验,过去,我一直缺, 自从学会复制粘贴以后,我的经验小康了 ,一口气拿五点,不费劲儿,复制一次粘 贴无数次,真实惠
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表手机版
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )|网站地图 酷辣虫

© 2001-2016 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表