PHP-CPP开发扩展(二)
PHP-CPP是一个用于开发PHP扩展的C++库。本节讲解PHP输出和函数的实现。
输出和错误
上面的helloworld示例里,我们使用Php::out进行输出,并使用了std::endl换行刷新缓冲。Php::out变量其实是std::ostream类的一个实例,支持PHP中设置的所有输出缓冲。它与PHP脚本中的echo()函数基本相同。
几个常用的方法说明:
std::flush显示刷新缓冲;std::endl输出换行并刷新缓冲;Php::out输出内容到缓冲;Php::notice生成一个PHP notice;Php::warning生成一个PHP warning;Php::deprecated生成一个PHP deprecated;Php::error生成一个PHP error
对于错误,通知和警告,我们不需要换行符,但我们仍然必须刷新缓冲区以实际生成输出。
Php::error流有一些非常特殊的东西:当你刷新它时,PHP脚本以致命错误结束。
有了上面的几个方法,我们就可以实现PHP的标准输出功能。
使用输出必须引入
iostream头文件。
实现PHP函数
上面的示例里其实我们已经实现了2个PHP函数。接下来,我们看看PHP-CPP如何实现以下4种函数:
- 无形参无返回值
- 无形参有返回值
- 有形参无返回值
- 有形参有返回值
得益于PHP-CPP封装的Php::Value和Php::Parameters类,我们可以很简单的实现上面这些函数。
Php::Value可以认为是PHP的变量,内部封装了zval结构。通过对运算符的重载,C++里的变量支持自动转为Php::Value类型。
1、无形参无返回值
void func(){}
2、无形参有返回值
Php::Value func(){}
3、有形参无返回值
void func(Php::Parameters ¶ms){}
4、有形参有返回值
Php::Value func(Php::Parameters ¶ms){}
示例:
/**
* User: 公众号: 飞鸿影的博客(fhyblog)
* Date: 2018/7
*/
Php::Value sum_n(Php::Parameters ¶ms)
{
int max = 0, sum = 0;
if(params.size() == 0){
Php::warning << "miss param" << std::flush;
return 0;
}
max = params[0];
if(params[0].type() != Php::Type::Numeric){
Php::warning << "param type must be numeric." << std::flush;
return 0;
}
for(int i = 1; i <= max; i++){
sum += i;
}
return sum;
}
该函数实现了有形参有返回值,其他几种改改就可以实现。函数里虽然返回的是C++的int类型变量,但是Php::Value会自动转为PHP语言类型变量。
我们只需要在get_module()里注册一下:
extension.add<sum_n>("sum_n");
tips: 最终暴露出来的函数名可以与C++里函数名不同,例如:
extension.add<sum_n>("sum_n2");
也是可以的。
重新编译即可:
$ sudo make clean && make && sudo make install
(未完待续)
想第一时间获取最新动态,欢迎关注关注飞鸿影的博客(fhyblog),不定期为您呈现技术干货。
PHP-CPP开发扩展(二)的更多相关文章
- Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式
目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...
- Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)
最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展, ...
- 手把手教你开发Chrome扩展二:为html添加行为
手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 上一节我们 ...
- PHP-CPP开发扩展(一)
PHP-CPP是一个用于开发PHP扩展的C++库.PHP-CPP提供了一系列完善的文档.易于使用和扩展的类,让你可以相对快速的创建PHP的原生扩展. 为什么使用PHP-CPP 很快 用C++编写的代码 ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 咨询管理的架构
咨询.留言.投诉等功能是网站应具备的基本功能,可以加强管理员与用户的交流,在上次完成文章部分后,这次开始做Member区域的咨询功能(留言.投诉都是咨询).咨询跟文章非常相似,而且内容更少.更简单. ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 添加文章
上次把架构做好了,这次做添加文章.添加文章涉及附件的上传管理及富文本编辑器的使用,早添加文章时一并实现. 要点: 富文本编辑器采用KindEditor.功能很强大,国人开发,LGPL开源,自己人的好东 ...
- 【OpenGL游戏开发之二】OpenGL常用API
OpenGL常用API 开发基于OpenGL的应用程序,必须先了解OpenGL的库函数.它采用C语言风格,提供大量的函数来进行图形的处理和显示.OpenGL库函数的命名方式非常有规律.所有OpenGL ...
- Lucene.Net 2.3.1开发介绍 —— 二、分词(一)
原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(一) Lucene.Net中,分词是核心库之一,当然,也可以将它独立出来.目前Lucene.Net的分词库很不完善,实际应用价值不高.唯 ...
- 【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序
关于 chrome 扩展的文章,很久之前也写过一篇.清除页面广告?身为前端,自己做一款简易的chrome扩展吧. 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点. 什么是 chrome 扩展 ...
- ----转载----【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序
关于 chrome 扩展的文章,很久之前也写过一篇.清除页面广告?身为前端,自己做一款简易的chrome扩展吧. 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点. 什么是 chrome 扩展 ...
随机推荐
- [leetcode]26. Remove Duplicates from Sorted Array有序数组去重(单个元素只出现一次)
Given a sorted array nums, remove the duplicates in-place such that each element appear only once an ...
- 交叉编译sudo
编译Sudo version 1.8.6p7下载路径:https://www.sudo.ws/news.html 1.交叉编译 # tar -xvf sudo-1.8.6p7.tar.gz # cd ...
- js 加减乘除失精
js 计算失精是因为js 先将10十进制代码转化为2进制,再计算导致 具体解决方案: 1. 加 function accAdd(arg1,arg2){ var r1,r2,m; ].length}} ...
- CSS实现左侧多级菜单栏
首先看要实现的效果, 主要是关心技术实现, 所以没怎么美化 我也是初学html, 所以写的比较啰嗦 1. 使用列表将内容显示出来 <!DOCTYPE html><html>&l ...
- python_day12_html
目录: 简单web的服务器代码 html简介 html常用标签 一.简单web的服务器代码 1.简单python服务器代码: import socket def main(): sock = sock ...
- python_day11
一.简介 1.什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 2.关系型数据库 ...
- 【Java】代理模式、反射机制-动态代理
关于代理模式和动态代理参考自:https://www.cnblogs.com/gonjan-blog/p/6685611.html 这里通过参考博客中的例子整理个人理解. 代理模式: 访问某个类的方法 ...
- poj2240
一个关于套利的题,就是判断是否有正环,我这里是用的SPFA,只要判断出来一种货币初始为1,最后变得大于1就代表是正环,要注意一下最后对vector的清空,当时从1开始清空,导致wa了两次,找了半天,尽 ...
- java30
1.类的组合关系 当一个类中的字段是一个类时,就称类依赖于字段这个类,也称这两个类为组合关系 2.快捷键:ctrl+shift+c,多行的// ctrl+shift+/,多行的/-----/ 3.类的 ...
- 无线网卡连接网络后共享给本地有线网卡使用(Win10)
无线网卡连接网络后共享给本地有线网卡使用(Win10) 1. 本文主要目的是介绍地有线网卡共享无线网卡的Wifi信号,该应用场景如下: 当在只有wifi环境下,同时有两台电脑A和B, A为笔记本: ...