目的:熟悉字符串在PHP扩展里面如何处理

要实现的PHP代码如下:

1、当字符串不包含指定前缀字符串时,把前缀字符串和被检测字符合并返回。

2、当字符串包含指定前缀字符串时,原样返回。 我们将使用PHP扩展的方式实现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";

?>

基础代码

在myecho扩展上增加 str_concat 方法。

实现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;

}

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新增的结构。结构如下:

[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结构专属的方法。主要有如下几个:

[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宏方法分别对应zend_string结构的成员。ZSTR_HASH是获取字符串的hash值,如果不存在,就调用hash函数生成一个。

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

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

编译生成扩展 参考《基于PHP7的PHP扩展开发之一(hello word)》

测试

echo str_concat("hello", "word");

echo "\n";

echo str_concat("hello", "hello lostphp.com");

echo "\n";

输出

hello word

hello lostphp.com

php 扩展 返回字符串,基于PHP7的PHP扩展开发之四(字符串的处理)相关推荐

  1. php7 定义变量,基于PHP7的PHP扩展开发之七(定义变量)

    目的:熟悉在PHP扩展里面如何定义变量 要实现的PHP代码如下: class lostphp{} $lng = 2; $str = "abc"; $arr = array(1,'a ...

  2. php7 ext skel_基于PHP7的PHP扩展开发之一(hello word)

    为什么要学PHP扩展开发?学会PHP扩展开发后,能增加你解决问题的能力.如,别人用PHP实现了一个功能.执行一次需要耗时10毫秒.而你用扩展实现了同样的功能,可能就只用1毫秒. PHP扩展的应用场景 ...

  3. php7 扩展 在哪下载,php7.0 redis扩展下载地址

    C# decimal保留指定的小数位数,不四舍五入 decimal保留指定位数小数的时候,.NET自带的方法都是四舍五入的. 项目中遇到分摊金额的情况,最后一条的金额=总金额-已经分摊金额的和. 这样 ...

  4. CentOS6.9编译安装Sphinx并使用php7的sphinx扩展实现全文搜索

    本篇笔记记录了CentOS6.9编译安装Sphinx,编译安装php-sphinx扩展,并使用php7的sphinx扩展实现全文搜索的过程 nginx+mysql+php安装请参考以下笔记: Cent ...

  5. php获取字符串扩展,PHP7扩展开发之字符串处理

    标签: 本文和大家分享的主要是PHP7扩展开发中字符串的处理相关知识,希望通过本文的分享能帮助大家更好的学习php. 这次,我们来看看字符串在PHP扩展里面如何处理. 示例代码如下: $len = s ...

  6. php7自定义异常处理,基于PHP7错误处理与异常处理方法(详解)

    PHP7错误处理 PHP 7 改变了大多数错误的报告方式.不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出. 这种 Error 异常可以像 Exception 异常一 ...

  7. 【HIMI转载推荐之三】基于Cocos2dx引擎UI扩展引擎包[cocos2d-x-3c]

    [前言点评] 此篇主要作者:jason-lee-lijunlin  基于Cocos2d-x引擎进行封装的UI框架的扩展包. 此文章Himi已经仔细看过,总体来说是篇很好的文章,是给使用-x引擎的童鞋们 ...

  8. linux php7扩展查看,linux安装PHP7以及扩展

    Linux下安装PHP7 事先升级gcc4.8,然后安装PHP7,安装步骤参考:CentOS安装PHP7 1.Linux下编译的php没有php.ini 解决办法:从源代码目录中复制php.ini-d ...

  9. python内置函数可以返回列表元组_Python内置函数()可以返回列表、元组、字典、集合、字符串以及range对象中元素个数....

    Python内置函数()可以返回列表.元组.字典.集合.字符串以及range对象中元素个数. 青岛远洋运输有限公司冷聚吉船长被评为全国十佳海员.()A:错B:对 有源逆变是将直流电逆变成其它频率的交流 ...

最新文章

  1. 实验3  数据库综合查询
  2. UnicodeDecodeError解决办法
  3. 函数式编程filter、map、reduce
  4. 分布式计算框架Gearman原理详解
  5. Delphi 设计模式:《HeadFirst设计模式》Delphi代码---模式小结之一个叫声接口和几只鸭子[转]...
  6. 记一次理想浪漫的毕旅
  7. 回顾 | 使用Visual Studio Code进行端到端应用程序开发
  8. 公需科目必须学吗_专业技术人员一般公需科目学习的通知
  9. POJ 2991 Crane(线段树+计算几何)
  10. 1043 Is It a Binary Search Tree (25 分) BST反转?不反转 遍历+vector
  11. 网易云音乐ncm格式转换为mp3
  12. java分布式特点_java分布式架构是什么?分布式架构的优缺点有哪些?
  13. JS验证18位身份证号的正确性
  14. 2021C语言全套教程
  15. 数控编程必备神器!Mastercam 2021让你的加工更高效更精准!
  16. 怎么用C语言搜索有根区间,C语言 判断一个数字是否在一个指定的区间范围内?求解答。。。。...
  17. IP地址192.168.48.10,掩码为255 255.255.128,其所在的子网为(),广播地址为),有效的主机IP地址范围从()到().
  18. 小程序微信头像授权、手机号授权、地理位置授权
  19. php exit code 255,使用exit(-1)为什么得到255退出码?
  20. 高精度加法竖式模拟器

热门文章

  1. PostgreSQL查看版本信息
  2. mybatis内部类映射写法
  3. jQuery基本使用
  4. 2进制 , 8进制 , 10进制 , 16进制 , 介绍 及 相互转换 及 快速转换
  5. python实现简易工资管理系统(Salary Manage)源码
  6. GitHub(从安装到使用)
  7. sublime 自定义快捷键
  8. JavaScript - 动态数据
  9. MAC OS上JAVA1.6 升级1.7,以及 maven3.2.1配置
  10. js作用域与作用域链