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::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 ¶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 referencevar_dump($a, $b);?>
(未完待续)
想第一时间获取最新动态,欢迎关注关注飞鸿影的博客(fhyblog)
,不定期为您呈现技术干货。
PHP-CPP开发扩展(三)
原文地址:https://www.cnblogs.com/52fhy/p/9351842.html