PHP-CPP开发扩展(三)
PHP-CPP是一个用于开发PHP扩展的C++库。本节讲解PHP函数形参相关的实现。
指定函数参数类型
有时候,我们需要指定函数的形参是数组或者指定的,那么在PHP-CPP里是否可以指定函数的参数类型呢?答案是可以的。
按值传递
示例:
/**
* User: 公众号: 飞鸿影的博客(fhyblog)
* Date: 2018/7
*/
#include <phpcpp.h>
void example(Php::Parameters ¶ms)
{
}
extern "C" {
PHPCPP_EXPORT void *get_module() {
static Php::Extension myExtension("my_extension", "1.0");
myExtension.add<example>("example", {
Php::ByVal("a", Php::Type::Numeric),
Php::ByVal("b", "ExampleClass"),
Php::ByVal("c", "OtherClass")
});
return myExtension;
}
}
我们使用Php::ByVal()
进行指定函数类型,示例里分别指定为Numeric
和自定义类类型。
我们再看一下Php::ByVal()
原型:
/**
* Constructor
* @param name Name of the parameter
* @param type Parameter type
* @param required Is this parameter required?
*/
ByVal(const char *name, Php::Type type, bool required = true);
第一个参数a
、b
、c
可以视为占位符,内部要用到,不重复即可。
第二个参数支持以下类型:
Php::Type::Null
Php::Type::Numeric
Php::Type::Float
Php::Type::Bool
Php::Type::Array
Php::Type::Object
Php::Type::String
Php::Type::Resource
Php::Type::Constant
Php::Type::ConstantArray
Php::Type::Callable
这些类型其实就是PHP支持的变量类型。
最后一个参数可以用来设置参数是否可选,默认必选。如果将其设置为true,则在没有此参数的情况下调用函数时,PHP将触发错误。
我们以sum_n
函数为例:
extension.add<sum_n>("sum_n", {
Php::ByVal("a", Php::Type::Numeric, true)
});
如果使用的时候不给参数,就会PHP Warning:
PHP Warning: sum_n() expects at least 1 parameter(s), 0 given in /media/d/work/php-ext/phpcpp/phpcpp_helloworld/test.php on line 4
Php::ByVal()
还有一种原型:
/**
* Constructor
* @param name Name of the parameter
* @param classname Name of the class
* @param nullable Can it be null?
* @param required Is this parameter required?
*/
ByVal(const char *name, const char *classname, bool nullable = false, bool required = true);
多了个nullable
:是否可以用NULL
来代替参数。比如:
extension.add<say_class>("say_class", {
Php::ByVal("class_name", "Datetime", true, true)
});
这个say_class
方法里,我们指定形参为Datetime
类型,可以使用NULL替代,参数必选。如果nullable
改为false,这时候就必须传指定类型Datetime
了。
引用传递
有时候我们需要支持函数直接修改原来的变量值,就需要使用引用的方式传参了。PHP-CPP也提供了Php::ByRef
进行支持。
/**
* Constructor
* @param name Name of the parameter
* @param type Parameter type
* @param required Is this parameter required?
*/
ByRef(const char *name, Php::Type type, bool required = true);
示例:
/**
* User: 公众号: 飞鸿影的博客(fhyblog)
* Date: 2018/7
*/
#include <phpcpp.h>
void swap(Php::Parameters ¶ms)
{
Php::Value temp = params[0];
params[0] = params[1];
params[1] = temp;
}
extern "C" {
PHPCPP_EXPORT void *get_module() {
static Php::Extension myExtension("my_extension", "1.0");
myExtension.add<swap>("swap", {
Php::ByRef("a", Php::Type::Numeric),
Php::ByRef("b", Php::Type::Numeric)
});
return myExtension;
}
}
我们使用test.php进行测试:
<?php
// define two variables
$a = 1;
$b = 2;
// 交换变量
swap($a, $b);
// 下面使用错误,仅支持变量引用
//swap(10,20); //会触发PHP Fatal error: Only variables can be passed by reference
var_dump($a, $b);
?>
(未完待续)
想第一时间获取最新动态,欢迎关注关注飞鸿影的博客(fhyblog)
,不定期为您呈现技术干货。
PHP-CPP开发扩展(三)的更多相关文章
- 手把手教你开发Chrome扩展三:关于本地存储数据
手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 HTML5 ...
- PHP-CPP开发扩展(一)
PHP-CPP是一个用于开发PHP扩展的C++库.PHP-CPP提供了一系列完善的文档.易于使用和扩展的类,让你可以相对快速的创建PHP的原生扩展. 为什么使用PHP-CPP 很快 用C++编写的代码 ...
- Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)
最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展, ...
- Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(五) 话接上篇,继续来说权重对排序的影响.从上面的4个测试,只能说是有个直观的理解了.“哦,是!调整权重是能影响排序了,但是好像没办法来 ...
- 【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序
关于 chrome 扩展的文章,很久之前也写过一篇.清除页面广告?身为前端,自己做一款简易的chrome扩展吧. 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点. 什么是 chrome 扩展 ...
- ----转载----【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序
关于 chrome 扩展的文章,很久之前也写过一篇.清除页面广告?身为前端,自己做一款简易的chrome扩展吧. 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点. 什么是 chrome 扩展 ...
- Android UI开发第三十九篇——Tab界面实现汇总及比较
Tab布局是iOS的经典布局,Android应用中也有大量应用,前面也写过Android中TAb的实现,<Android UI开发第十八篇——ActivityGroup实现tab功能>.这 ...
- HyperLeger Fabric开发(三)——HyperLeger Fabric架构
HyperLeger Fabric开发(三)--HyperLeger Fabric架构 一.HyperLeger Fabric逻辑架构 1.HyperLeger Fabric逻辑架构简介 Fabric ...
- php开发扩展环境的搭建(Windows)
php开发扩展环境的搭建(Windows) 前期准备: (1) 下载php-5.3.10源码包(php-5.3.10.tar.bz2)并解压到C:\php-5.3.10:下载二进制包php-5.3.1 ...
- Java开发学习(三十六)----SpringBoot三种配置文件解析
一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...
随机推荐
- Solidity的地址 数组如何判断是否包含一个给定的地址?
Q: given address[] wallets. What is the correct method to check that the list contains a given addre ...
- 如何通过RNA-Seq了解转录本的结构
[转载]如何通过RNA-Seq了解转录本的结构 已有 1942 次阅读 2014-12-26 15:22 |个人分类:转录组测序|系统分类:科研笔记|关键词:RNA-Seq,转录组测序,转录本结构| ...
- LibreOJ #6014. 「网络流 24 题」最长 k 可重区间集
#6014. 「网络流 24 题」最长 k 可重区间集 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 ...
- python 的面相对象编程--对应c++
在python的面相对象编程中,我们常常在class中可以看到a(), _b() , __c(), __d()__这样的函数. 由于我是看廖雪峰老师的教程,廖老师为了简单起见,没有引入太多概念,我 ...
- 【java】:Junit
创建单元测试文件 点击创建测试文件的目录,比如,我要在control目录下添加一个测试类,点击control文件夹 右键->new->other->junit test case 下 ...
- [uboot] (第五章)uboot流程——uboot启动流程
http://blog.csdn.net/ooonebook/article/details/53070065 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为 ...
- Java集合:ConcurrentHashMap原理分析
集合是编程中最常用的数据结构.而谈到并发,几乎总是离不开集合这类高级数据结构的支持.比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap).这篇文章主 ...
- 2019.02.27 bzoj4556: [Tjoi2016&Heoi2016]字符串(二分答案+sam+线段树合并)
传送门 题意:给一个字符串SSS. 有mmm次询问,每次给四个参数a,b,c,da,b,c,da,b,c,d,问s[a...b]s[a...b]s[a...b]的所有子串和s[x...y]s[x... ...
- 小程序页面传值e.currentTarget
将页面确定上的数值5传到js 微信官网 wtml: <view class="distpicker-btn"> <view class="distpic ...
- golang注意问题
关于slice 我们都知道slice是在通过参数传递的时候传递的是引用 slice的appen操作是有返回值的,并不改变原值 例如 b := [],,,} c:=append(b, ) // b 不变 ...