IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> phpcpp-函数(三) -> 正文阅读

[PHP知识库]phpcpp-函数(三)

函数声明及注册

函数的声明
  1. 可以声明带参数,不带参数及有返回值与没有返回值的函数类型
//无返回值,不带参数
void example1();
//带参数无返回值
void example2(Php::Parameters &params);
//又返回值不参
Php::Value example3();
//带参数及返回值
Php::Value example4(Php::Parameters &params);
  1. 函数参数类型
    函数的参数可以囊括所有的类型包括数组,对象,string等,但是都通过Php::Parameters &params 来接收,函数在注册到extension 的时候声明函数的形参及类型;
  2. 函数形参类型
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
函数注册
  1. 将需要暴露的函数通过extension 对象返回
  2. 函数参数既可以声明按值传递也可以声明引用传值
  • Php::ByVal 按值传递
  • Php::ByRef 引用传值
  1. 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 &params)
{
    // 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;
}
  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
     下一篇文章      查看所有文章
加:2021-07-04 18:51:00  更:2021-07-04 19:03:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/14 14:46:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码