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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457125.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对象之int介绍

#Auther Bob #--*--conding:utf-8 --*-- #创建两个int的对象&#xff0c;age1和age2age1 10 age2 int(1)#查看对象的类print(type(age1))# <class int>print(type(age2))# <class int> #bit_length表示一个十进制数最少需要占用多个二进制位print(age1.bit_lengt…

Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.

谷歌浏览器报错 版本 73.0.3683.103&#xff08;正式版本&#xff09; &#xff08;32 位&#xff09;报错内容如下Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.jquery.js:2 Cross-Origin Read Blocking (CORB) blocked cros…

OpenStack 之vmware机器迁移到openstack集群

原理 openstack本身是支持使用vmware格式的镜像的&#xff0c;但是是需要我们我们在/etc/nova/nova.conf的配置文件中指定该计算节点使用vmware的驱动 123456789101112# Driver to use for controlling virtualization. Options# include: libvirt.LibvirtDriver, xenapi.XenAP…

解决Django静态文件配置pycharm高光问题

就困扰了我半天的Django静态文件配置问题 更改了setting 文件后 文件参考问题总会高亮让然觉得又错误怪怪的 所以索性直接眼不见心不烦 具体操作如下图&#xff1a; 就这样就可以啦 大功告成&#xff01; 也顺便提一下静态文件配置问题&#xff1a; Django静态加载的设置…

Weblogic的管理服务器与受管服务器

weblogic管理服务器和受管服务器&#xff1a; 域包含一个称为“管理服务器”的特殊 WebLogic Server 实例&#xff0c;它是您配置和管理域中所有资源的中心点&#xff0c;一个域有仅只有一个管理服务器实例。 在生产环境中&#xff0c;应将 Web 应用程序、EJB 和其他资源部…

python神经网络可视化,python中的神经网络感受野可视化

这是我想出的解决方案。谢谢mprat的帮助。在我发现spectralcolormap最适合这种任务&#xff0c;而且我还添加了您可以指定的边框。在from matplotlib import pyplotimport numpy as npborder 2images_amount 300row_amount 10col_amount 30image_height 28image_width 28…

Qt 多媒体音频模拟按钮发音(音视频启动)

## 项目演示 平台:windows或者ubuntu 要求:平台需要支持音频播放功能 文件格式:.wav 可以使用剪映生成,音频部分,我这里是简短的音乐 # Qt 多媒体简介 Qt QSound是Qt框架中的一个类,用于播放音频文件。它可以在Qt应用程序中实现简单的音频播放功能,包括播放、暂停和…

ASP.NET MVC5 ModelBinder

什么是ModelBinding ASP.NET MVC中&#xff0c;所有的请求最终都会到达某个Controller中的某个Action并由该Action负责具体的处理和响应。为了能够正确处理请求&#xff0c;Action的参数&#xff08;如果有的话&#xff09;&#xff0c;必须在Action执行之前&#xff0c;根据相…

Day07-函数(2)

1.函数类型 函数也是一种类型&#xff0c;我们自定义的函数就是函数对象&#xff0c;函数名保存了函数对象的引用&#xff08;地址&#xff09; def test():print(我是测试函数) ​ print(test) #函数名是变量&#xff0c;指向了函数对象 pf test #pf变量也指向了函数对…

php在html里面的位置,关于script在html中的摆放位置解析

以前一直觉得script在html中的任何位置都可以&#xff0c;今天做一个需求的时候才更正了自己的错误思想啊--script的位置也不是随便放的。本文主要谈论关于script在html中的摆放位置。小编觉得挺不错的&#xff0c;现在就分享给大家&#xff0c;也给大家做个参考。希望能帮助到…

Protocol Buffer技术详解(C++实例)

原文&#xff1a;http://www.cnblogs.com/stephen-liu74/archive/2013/01/04/2842533.html 这篇Blog仍然是以Google的官方文档为主线&#xff0c;代码实例则完全取自于我们正在开发的一个Demo项目&#xff0c;通过前一段时间的尝试&#xff0c;感觉这种结合的方式比较有利于培训…

yaml 解决问题

yaml 是什么&#xff1f; 在 github 一些开源项目里经常可以看到 .travis.yml 文件&#xff0c;后来接触持续集成这个概念时发现很多文件都是 .yml 后缀的文件。我在 阮一峰-YAML 语言教程 里了解了它的作用以及基本写法&#xff0c;他的那篇文章描述的略微有点啰嗦&#xff0…

2016 7 25 链表

1 #include<stdio.h>2 #include<stdlib.h>3 /* 4 usingnamespacestd;5 6 structNode7 {8 int data;//数据域9 struct Node*next;//指针域10 };11 12 /*13 Create14 *函数功能&#xff1a;创建链表.15 *输入&#xff1a;各节点的data16 *返回值&#xff1a;指…

php数值操作,php数值计算num类简单操作示例

php数值计算num类简单操作示例,在线,计算器,小数,整数,程序设计php数值计算num类简单操作示例易采站长站&#xff0c;站长之家为您整理了php数值计算num类简单操作示例的相关内容。本文实例讲述了php数值计算num类简单操作。分享给大家供大家参考&#xff0c;具体如下&#xff…

YAML-学习笔记!

YAML学习笔记 一、YAML简介 YAML&#xff0c;即YAML Ain’t Markup Language的缩写&#xff0c;YAML 是一种简洁的非标记语言。YAML以数据为中心&#xff0c;使用空白&#xff0c;缩进&#xff0c;分行组织数据&#xff0c;从而使得表示更加简洁易读。 二、YAML语法 1、基本规…

CentOS远程监控

近日&#xff0c;因工作需要&#xff0c;学习了CentOS远程监控的水平有限&#xff0c;多指教。 远程访问CentOS&#xff0c;包括三种方式ssh&#xff0c;telnet&#xff0c;vnc。 本例涉及的是以vnc远程访问CentOS。指令在root下操作。注意&#xff1a;vnc的端口为5900&#xf…

aix oracle 10.2.0.1 升级 10.2.0.4,AIX Oracle RAC 升级到10.2.0.4.0要特别注意的问题 - 爱肯的专栏 ......

AIX Oracle RAC 升级到10.2.0.4.0过程有如下报错(直接升级到10.2.0.4不需要应用Patch:6160398)&#xff1a;rootbwgl_db2:/u01/app/oracle/crs_1/bin# /u01/app/oracle/crs_1/install/root102.shError : Please change the CRS_ORACLE_USER id to have the following OS capabi…

将文件提交到github的两种方法

方法一 简要步骤如下&#xff1a; 登陆github&#xff0c;创建git仓库。记此git仓库的地址为[github_repository_url]&#xff0c;例如git仓库的地址&#xff1a;https://github.com/galian123/nodejs_http_server 在本地的工程目录执行git init&#xff0c;此工程目录是要提…

Visual Studio 2017新版发布,极大提高开发效率丨附下载

最新的Visual Studio 2017免费下载&#xff1a;https://www.evget.com/product...【包含Professional、Enterprise、Community版本】 为任何开发、应用和平台提供无与伦比的效率&#xff0c;Visual Studio 2017 候选发布。 提高了效率 代码导航、IntelliSense、重构、代码修复和…

BGP路由协议详解(完整篇)

原文链接&#xff1a;http://xuanbo.blog.51cto.com/499334/465596/ 2010-12-27 12:02:45 上个月我写一篇关于BGP协议的博文&#xff0c;曾许诺过要完善这个文档&#xff0c;但因最近的工作和授课很忙&#xff0c;所以没有时间进行完善。为了实现这个承诺&#xff0c;我在去外…