php 扩展 返回字符串,基于PHP7的PHP扩展开发之四(字符串的处理)
目的:熟悉字符串在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扩展开发之四(字符串的处理)相关推荐
- php7 定义变量,基于PHP7的PHP扩展开发之七(定义变量)
目的:熟悉在PHP扩展里面如何定义变量 要实现的PHP代码如下: class lostphp{} $lng = 2; $str = "abc"; $arr = array(1,'a ...
- php7 ext skel_基于PHP7的PHP扩展开发之一(hello word)
为什么要学PHP扩展开发?学会PHP扩展开发后,能增加你解决问题的能力.如,别人用PHP实现了一个功能.执行一次需要耗时10毫秒.而你用扩展实现了同样的功能,可能就只用1毫秒. PHP扩展的应用场景 ...
- php7 扩展 在哪下载,php7.0 redis扩展下载地址
C# decimal保留指定的小数位数,不四舍五入 decimal保留指定位数小数的时候,.NET自带的方法都是四舍五入的. 项目中遇到分摊金额的情况,最后一条的金额=总金额-已经分摊金额的和. 这样 ...
- CentOS6.9编译安装Sphinx并使用php7的sphinx扩展实现全文搜索
本篇笔记记录了CentOS6.9编译安装Sphinx,编译安装php-sphinx扩展,并使用php7的sphinx扩展实现全文搜索的过程 nginx+mysql+php安装请参考以下笔记: Cent ...
- php获取字符串扩展,PHP7扩展开发之字符串处理
标签: 本文和大家分享的主要是PHP7扩展开发中字符串的处理相关知识,希望通过本文的分享能帮助大家更好的学习php. 这次,我们来看看字符串在PHP扩展里面如何处理. 示例代码如下: $len = s ...
- php7自定义异常处理,基于PHP7错误处理与异常处理方法(详解)
PHP7错误处理 PHP 7 改变了大多数错误的报告方式.不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出. 这种 Error 异常可以像 Exception 异常一 ...
- 【HIMI转载推荐之三】基于Cocos2dx引擎UI扩展引擎包[cocos2d-x-3c]
[前言点评] 此篇主要作者:jason-lee-lijunlin 基于Cocos2d-x引擎进行封装的UI框架的扩展包. 此文章Himi已经仔细看过,总体来说是篇很好的文章,是给使用-x引擎的童鞋们 ...
- linux php7扩展查看,linux安装PHP7以及扩展
Linux下安装PHP7 事先升级gcc4.8,然后安装PHP7,安装步骤参考:CentOS安装PHP7 1.Linux下编译的php没有php.ini 解决办法:从源代码目录中复制php.ini-d ...
- python内置函数可以返回列表元组_Python内置函数()可以返回列表、元组、字典、集合、字符串以及range对象中元素个数....
Python内置函数()可以返回列表.元组.字典.集合.字符串以及range对象中元素个数. 青岛远洋运输有限公司冷聚吉船长被评为全国十佳海员.()A:错B:对 有源逆变是将直流电逆变成其它频率的交流 ...
最新文章
- 实验3 数据库综合查询
- UnicodeDecodeError解决办法
- 函数式编程filter、map、reduce
- 分布式计算框架Gearman原理详解
- Delphi 设计模式:《HeadFirst设计模式》Delphi代码---模式小结之一个叫声接口和几只鸭子[转]...
- 记一次理想浪漫的毕旅
- 回顾 | 使用Visual Studio Code进行端到端应用程序开发
- 公需科目必须学吗_专业技术人员一般公需科目学习的通知
- POJ 2991 Crane(线段树+计算几何)
- 1043 Is It a Binary Search Tree (25 分) BST反转?不反转 遍历+vector
- 网易云音乐ncm格式转换为mp3
- java分布式特点_java分布式架构是什么?分布式架构的优缺点有哪些?
- JS验证18位身份证号的正确性
- 2021C语言全套教程
- 数控编程必备神器!Mastercam 2021让你的加工更高效更精准!
- 怎么用C语言搜索有根区间,C语言 判断一个数字是否在一个指定的区间范围内?求解答。。。。...
- IP地址192.168.48.10,掩码为255 255.255.128,其所在的子网为(),广播地址为),有效的主机IP地址范围从()到().
- 小程序微信头像授权、手机号授权、地理位置授权
- php exit code 255,使用exit(-1)为什么得到255退出码?
- 高精度加法竖式模拟器