函数声明及注册
函数的声明
可以声明带参数,不带参数及有返回值与没有返回值的函数类型
//无返回值,不带参数
void example1();
//带参数无返回值
void example2(Php::Parameters ¶ms);
//又返回值不参
Php::Value example3();
//带参数及返回值
Php::Value example4(Php::Parameters ¶ms);
函数参数类型 函数的参数可以囊括所有的类型包括数组,对象,string等,但是都通过Php::Parameters ¶ms 来接收,函数在注册到extension 的时候声明函数的形参及类型; 函数形参类型
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
函数注册
将需要暴露的函数通过extension 对象返回 函数参数既可以声明按值传递也可以声明引用传值
Php::ByVal 按值传递 Php::ByRef 引用传值
php::byval 与php::byref 都实现了两个构造函数,主要针对于类对象参数(规范类标量,也可以声明php::typ::object 对象类型)与其他参数类型的声明
/**
* 普通参数构造
* 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);
/**
* 类对象参数构造
* 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);
示例代码
/**
* 告诉编译器get_module是个纯C函数
*/
extern "C" {
/**
* 本函数在PHP进程一打开就会被访问,并返回一个描述扩展信息的PHP结构指针
*/
PHPCPP_EXPORT void *get_module()
{
// 必须是static类型,因为扩展对象需要在PHP进程内常驻内存
static Php::Extension extension("helloworld", "1.0.0");
//这里可以添加你要暴露给PHP调用的函数
extension.add<example1>("example1");
//添加参数并限制类型
//php5 不能严格限制Numeric,string标量,php7则可以
extension.add<example2>("example1", {
//按值传递
Php::ByVal("a", Php::Type::Numeric),
//按引用传值
Php::ByRef("b", Php::Type::Numeric)
});
extension.add<example1>("example3");
extension.add<example4>("example4", {
//传入array
Php::ByVal("a", Php::Type::Array)
//传dateTime类对象
Php::ByVal("time", "DateTime", true)
});
// 返回扩展对象指针
return extension;
}
}
函数的调用
可以在cpp 写的拓展内部调用Zend 引擎内置的函数、扩展中定义的函数和用户自定义函数
void example_function(Php::Parameters ¶ms)
{
// first parameter is an array
Php::Value array = params[0];
// 内置PHP内置函数
std::vector<std::string> keys = Php::array_keys(array);
// 调用用户函数
Php::Value data = Php::call("some_function", "some_parameter");
// 实例化一个对象并调动对象函数
Php::Object time("DateTime", "now");
Php::out << time.call("format", "Y-m-d H:i:s") << std::endl;
//传入匿名函数并执行
Php::Value callback = params[1];
callback("some","parameter");
//通过数组调取对象成员函数(对象,对象成员函数)
Php::Array time_format({time, "format"});
Php::out << time_format("Y-m-d H:i:s") << std::endl;
}