PHP扩展封装之六步骤

点击查看原文

将面向过程的C或C++接口封装给PHP使用,即这里指的面向过程的封装。

封装PHP扩展的意义在于:由于PHP不能直接使用C函数,他需要使用自己的内存管理方式和参数管理方式,因此要在C代码和PHP代码间,将要使用的函数和变量做一个“一一映射”。

封装大致分为6步:

1.包含头文件

2.声明导出函数

3.声明zend函数块

4.声明zend模块

5.实现get_module()函数

6.实现导出函数

可以看一个最简单的例子,源分别是文件test.h和test.cpp,他们生成extern_test.so。然后由test.php动态加载这个动态链接库。

*********************************************************

//test.h

 

#ifndef _EXTERN_TEST_H_

#define _EXTERN_TEST_H_

#include <stdio.h>

 

//包含头文件,即引入所需要的宏、API定义等

#ifdef __cplusplus

extern "C" {

#endif

# include "php.h"

# include "php_ini.h"

# include "ext/standard/info.h"

#ifdef __cplusplus

}

#endif

 

#define EXTERN_TEST_VERSTR "0.1.0"

 

ZEND_MINFO_FUNCTION( extern_test );

ZEND_FUNCTION( extern_test_func ); //声明导出函数

#endif

************************************************************

//test.cpp

#include "test.h"

 

//声明zend函数块

zend_function_entry extern_test_functions[] =

{

ZEND_FE( extern_test_func,NULL )

{ NULL,NULL,NULL }

};

 

//声明zend模块

zend_module_entry extern_test_module_entry =

{

STANDARD_MODULE_HEADER,

"extern_test",

extern_test_functions,

NULL,

NULL,

NULL,

NULL,

ZEND_MINFO(extern_test),

EXTERN_TEST_VERSTR ,

STANDARD_MODULE_PROPERTIES

};

 

//实现get_module()函数

#ifdef __cplusplus

BEGIN_EXTERN_C()

#endif

ZEND_GET_MODULE(extern_test)

#ifdef __cplusplus

END_EXTERN_C()

#endif

 

ZEND_MINFO_FUNCTION(extern_test)

{

}

 

//实现导出函数

ZEND_FUNCTION( extern_test_func )

{

int iInt=0;

if ( ZEND_NUM_ARGS() == 1 ){

if ( zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l",&iInt) == FAILURE){

RETURN_LONG( ERR_PARAM_NUM );

}

}else{

RETURN_LONG( ERR_PARAM_NUM );

}

RETURN_LONG(iInt);

}

************************************************************

<?php

//test.php

dl( "extern_test.so" );

echo extern_test_func(12345);

?>

************************************************************

上述php程序执行后,会输出“12345”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值