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::ValuePhp::Parameters类,我们可以很简单的实现上面这些函数。

Php::Value可以认为是PHP的变量,内部封装了zval结构。通过对运算符的重载,C++里的变量支持自动转为Php::Value类型。

1、无形参无返回值

void func(){}

2、无形参有返回值

Php::Value func(){}

3、有形参无返回值

void func(Php::Parameters &params){}

4、有形参有返回值

Php::Value func(Php::Parameters &params){}

示例:

/**
* User: 公众号: 飞鸿影的博客(fhyblog)
* Date: 2018/7
*/ Php::Value sum_n(Php::Parameters &params)
{
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开发扩展(二)的更多相关文章

  1. Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  2. Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)

    最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展, ...

  3. 手把手教你开发Chrome扩展二:为html添加行为

    手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 上一节我们 ...

  4. PHP-CPP开发扩展(一)

    PHP-CPP是一个用于开发PHP扩展的C++库.PHP-CPP提供了一系列完善的文档.易于使用和扩展的类,让你可以相对快速的创建PHP的原生扩展. 为什么使用PHP-CPP 很快 用C++编写的代码 ...

  5. ASP.NET MVC5 网站开发实践(二) Member区域 - 咨询管理的架构

    咨询.留言.投诉等功能是网站应具备的基本功能,可以加强管理员与用户的交流,在上次完成文章部分后,这次开始做Member区域的咨询功能(留言.投诉都是咨询).咨询跟文章非常相似,而且内容更少.更简单. ...

  6. ASP.NET MVC5 网站开发实践(二) Member区域 - 添加文章

    上次把架构做好了,这次做添加文章.添加文章涉及附件的上传管理及富文本编辑器的使用,早添加文章时一并实现. 要点: 富文本编辑器采用KindEditor.功能很强大,国人开发,LGPL开源,自己人的好东 ...

  7. 【OpenGL游戏开发之二】OpenGL常用API

    OpenGL常用API 开发基于OpenGL的应用程序,必须先了解OpenGL的库函数.它采用C语言风格,提供大量的函数来进行图形的处理和显示.OpenGL库函数的命名方式非常有规律.所有OpenGL ...

  8. Lucene.Net 2.3.1开发介绍 —— 二、分词(一)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(一) Lucene.Net中,分词是核心库之一,当然,也可以将它独立出来.目前Lucene.Net的分词库很不完善,实际应用价值不高.唯 ...

  9. 【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序

    关于 chrome 扩展的文章,很久之前也写过一篇.清除页面广告?身为前端,自己做一款简易的chrome扩展吧. 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点. 什么是 chrome 扩展 ...

  10. ----转载----【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序

    关于 chrome 扩展的文章,很久之前也写过一篇.清除页面广告?身为前端,自己做一款简易的chrome扩展吧. 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点. 什么是 chrome 扩展 ...

随机推荐

  1. js学习(5)语法专题

    Js是一种动态类型语言,变量没有类型限制,可以随时赋值 强制转换: 主要指使用Number(),String()和Boolean()三个函数,手动将各个类型的值,分别转换为数字,字符串或布尔值 Num ...

  2. 47-java 排列组合

    import java.util.HashSet; public class Main1 { public static int ys = 0; public static int ys2 = 0; ...

  3. vue.$nextTick 解决了哪些问题

    转载:https://www.cnblogs.com/xuewuhen/p/7860989.html $nextTick 是在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后使用 $next ...

  4. MySQL开发——【多表关系、引擎、外键、三范式】

    多表关系 一对一关系 一对多或多对一关系 多对多关系 MySQL引擎 所谓的MySQL引擎就是数据的存储方式,常用的数据库引擎有以下几种: Myisam与InnoDB引擎之间的区别(面试) ①批量插入 ...

  5. docker 支持ipv6 (核心要点是ndp需要把docker内的ip全部加入到ndplist中来)

    IPv6 with Docker Estimated reading time: 10 minutes The information in this section explains IPv6 wi ...

  6. ps高级磨皮的7个步骤

    1.打开图片 2. 进入通道看红绿蓝哪个通道痘比较明显拖拽复制拷贝哪个通道! 3.选中拷贝的通道--执行滤镜--其他--高反差保留 4.在执行图像--计算(混合模式强光)--计算三次 5.选alpha ...

  7. windbg 经典死锁调试

    代码 // Deadlock_Debug.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "windows.h& ...

  8. delphi 中的浮点数 (转载)

    原文地址 Floating point numbers — Sand or dirt Floating point numbers are like piles of sand; every time ...

  9. 根据Excel模板存储数据,并下载

    @RequestMapping("/exportList") @ResponseBody public Map<String, Object> exportList(H ...

  10. 第37章:MongoDB-集群--Replica Sets(副本集)---单机的搭建

    ①创建副本集 1:先创建几个存放数据的文件夹,比如在前面的dbs下面创建db1,db2,db3: 同理在前面的logs下面创建logs1,logs2,logs3 2:在启动MongoDB服务器的时候, ...