PHP-CPP是一个用于开发PHP扩展的C++库。本节讲解PHP函数形参相关的实现。

指定函数参数类型

有时候,我们需要指定函数的形参是数组或者指定的,那么在PHP-CPP里是否可以指定函数的参数类型呢?答案是可以的。

按值传递

示例:

/**
* User: 公众号: 飞鸿影的博客(fhyblog)
* Date: 2018/7
*/ #include <phpcpp.h> void example(Php::Parameters &params)
{
} 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);

第一个参数abc可以视为占位符,内部要用到,不重复即可。

第二个参数支持以下类型:

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 &params)
{
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开发扩展(三)的更多相关文章

  1. 手把手教你开发Chrome扩展三:关于本地存储数据

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

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

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

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

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

  4. Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(五) 话接上篇,继续来说权重对排序的影响.从上面的4个测试,只能说是有个直观的理解了.“哦,是!调整权重是能影响排序了,但是好像没办法来 ...

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

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

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

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

  7. Android UI开发第三十九篇——Tab界面实现汇总及比较

    Tab布局是iOS的经典布局,Android应用中也有大量应用,前面也写过Android中TAb的实现,<Android UI开发第十八篇——ActivityGroup实现tab功能>.这 ...

  8. HyperLeger Fabric开发(三)——HyperLeger Fabric架构

    HyperLeger Fabric开发(三)--HyperLeger Fabric架构 一.HyperLeger Fabric逻辑架构 1.HyperLeger Fabric逻辑架构简介 Fabric ...

  9. php开发扩展环境的搭建(Windows)

    php开发扩展环境的搭建(Windows) 前期准备: (1) 下载php-5.3.10源码包(php-5.3.10.tar.bz2)并解压到C:\php-5.3.10:下载二进制包php-5.3.1 ...

  10. Java开发学习(三十六)----SpringBoot三种配置文件解析

    一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...

随机推荐

  1. linux resin 基本站点配置

    进入配置文件目录: [root@linuxidc resin-]# cd /usr/local/resin/conf/ 查看都有哪些配置文件: [root@linuxidc conf]# ls app ...

  2. Linux环境部署项目引起Out of Memory Error: PermGen Space的解决方案

    1. 背景 前几天,在搭建项目时遇到到一些问题,现在整理记录一下. Linux环境:Red Hat Enterprise Linux Server release 6.4: # 查看命令cat /et ...

  3. OKR 与 KPI

    作者:Cat Chen链接:https://www.zhihu.com/question/22478049/answer/23833548来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

  4. ssh 绕过The authenticity of host '*.*.*.*' can't be established 直接输入密码

    只需要使用命令 ssh webgate@10.129.6.237 -o "StrictHostKeyChecking no" 即可以绕过 insp_ap@inspect02:/ho ...

  5. Wordpress“固定链接”页面出现404原因及解决方法

    编辑配置文件:/etc/apache2/apache2.conf(非常靠后的位置),将里面的AllowOverride选项由None设置为All. <Directory /> Option ...

  6. 可遇不可求的Question之skip-name-resolve模式篇

    mysql启用skip-name-resolve模式时出现Warning的处理办法 在优化MYSQL配置时,加入 skip-name-resolve ,在重新启动MYSQL时检查启动日志,发现有警告信 ...

  7. 展示博客---Alpha版本展示

    Alpha版本展示 1. 团队成员的简介和个人博客地址,团队的源码仓库地址. 成员 简介 个人博客地址 祁泽文 被动态统计图搞扒下的我 http://www.cnblogs.com/jiaowoxia ...

  8. noip第15课资料

  9. Python学习第2章

    1.字符串: python中创建字符串我们可以使用引号''或"'. python访问子字符串,可以使用方括号来截取字符串: var="hello world!" var2 ...

  10. 【转】vim 命令

    Vim命令合集 建议直接看原文:(排版有些乱) 命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接 ...