PHP7扩展开发之字符串处理

本文和大家分享的主要是PHP7扩展开发中字符串的处理相关知识,希望通过本文的分享能帮助大家更好的学习php

这次,我们来看看字符串在PHP扩展里面如何处理。

示例代码如下:

<?phpfunction 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功能。

代码

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

}

代码说明

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

struct _zend_string {

zend_refcounted_h gc; /*gc信息*/

zend_ulong h; /* hash value */

size_t len; /*字符串长度*/

char val[1]; /*字符串起始地址*/

};

在 Zend/zend_string.h 提供了一些zend_string处理的一些方法。

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)

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

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

这些方法在 Zend/zend_operators.h 文件中。

来源:博学无忧

时间: 2024-10-10 14:44:15

PHP7扩展开发之字符串处理的相关文章

php7扩展开发[9] zend_call_method和zend_call_function

场景:我们想要在php7扩展中调用用户自定的类中的方法,而且方法有多个参数,找到以下方 法,没有看到可以超过两个参数的方法.所以一直向下查找,发现zend_call_method调用的 zend_call_function,但是并非只能传两个参数.一直追下去.这样我们用zend_call_function来调用多个参数,实现我们要的目的. 函数原型:在 Zend/zend_interfaces.下: #define zend_call_method_with_0_params(obj, obj_

PHP7扩展开发之实现简单运算函数

实现一个简单的数学计算函数,传入3个参数,计算出相应的结果.  如:    echo "90+20=".cal_culator(90,20,'+');   echo "90-20=".cal_culator(90,20,'-');   echo "90*20=". cal_culator(90,20,'*');   echo "90/20=". cal_culator(90,20,'/');   echo "90%2

php7扩展开发[11] MVC之路由解析和加载文件

```场景:想要用C实现PHP的一个MVC结构的路由解析和加载文件的功能,一共要解决几个问题1.由于MVC要加载多个C文件,所以要修正config.m4,修改config.m4内容第十行左右,去掉dnl,PHP_ARG_WITH(dora, for route support,dnl Make sure that the comment is aligned:[  --with-route             Include dora support])在下面追加到以下内容:if test

Chrome扩展开发之三——Chrome扩展中的数据本地存储和下载

目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式 3.Chrome扩展开发之三——Chrome扩展中的数据本地存储和下载 4.Chrome扩展开发之四——Gmail API的简单介绍 5.Chrome扩展开发之五——OAuth2的理解 6.Chrome扩展开发之六——GmailAssist核心功能的实现(包括Gmail API的使用中的

Chrome扩展开发之四——核心功能的实现思路

目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式 3.Chrome扩展开发之三——Chrome扩展中的数据本地存储和下载 4.Chrome扩展开发之四——核心功能的实现思路 如果你对GmailAssist感兴趣,可以在chrome商店中搜索“Gmail助手”,或点击这里直接访问商店来安装试用:如果你对GmailAssist的源码感兴趣,

PHP扩展开发(1):入门

有关PHP扩展开发的文章.博客已经很多了,比较经典的有: TIPI项目(http://www.php-internals.com/,强烈推荐) <Extending and Embedding PHP>(中文翻译见http://www.walu.cc/phpbook/,强烈推荐) <PHP核心技术与最佳实践>一书有一章专门讲PHP扩展开发的,不过版本较老,可供参考. <PHP5权威指南>一书中也有一章专门讲到了PHP的扩展开发. 我准备在此系列博文中总结我有关PHP扩展

【原创】PHP扩展开发进阶

PHP扩展开发进阶 ?作者:wf (360电商技术) 在第一期PHP扩展开发入门中,简单的介绍了PHP的总体架构和执行机制,并具体说明了怎样开发和编译一个主要的PHP扩展,最后在PHP 5.3的环境下结合zend api高速编写了一个静态的PHP扩展. 然而仅仅编译一个PHP扩展是没有实际用途的,它仅仅是一个华丽的外壳,为了使扩展实现更强大的功能,须要在扩展中开发一些有用的功能函数.在这一章中,将会着重介绍PHP内核中变量的实现.在此基础上,才干将须要的功能,使用zend api在PHP扩展中实

Firefox 扩展开发手记

2015.7.14 因工作,想写一个能实现将 Excel 中的信息自动提交到网页表单的工具,决定开发一个插件试验一下.第一次开发 FF 插件,也决定写一下开发日志,一方面和大家分享经验,另一方面也是希望能坚持到底 今天主要做了信息收集. 了解到基本上只需要 XML 和 Javascrtip 就可以了 FF 官方开发中心 https://developer.mozilla.org/en-US/Add-ons/Overlay_Extensions/XUL_School/Getting_Started

PHP扩展开发教程(总结)

PHP是一种解释型的语言,对于用户而言,我们精心的控制内存意味着easier prototyping和更少的崩溃!当我们深入到内核之后,所有的安全防线都已经被越过,最终还是要依赖于真正有责任心的软件工程师来保证系统的稳定运行. 1.线程安全宏定义 在TSRM/TSRM.h文件中有如下定义 #define TSRMLS_FETCH()       void ***tsrm_ls = (void ***) ts_resource_ex(0, NULL)#define TSRMLS_FETCH_FRO