分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

PHP-CPP开发扩展(三)

发布时间:2023-09-06 02:06责任编辑:顾先生关键词:PHP

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::NullPhp::Type::NumericPhp::Type::FloatPhp::Type::BoolPhp::Type::ArrayPhp::Type::ObjectPhp::Type::StringPhp::Type::ResourcePhp::Type::ConstantPhp::Type::ConstantArrayPhp::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 referencevar_dump($a, $b);?>

(未完待续)

想第一时间获取最新动态,欢迎关注关注飞鸿影的博客(fhyblog),不定期为您呈现技术干货。

PHP-CPP开发扩展(三)

原文地址:https://www.cnblogs.com/52fhy/p/9351842.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved