博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php7扩展开发[7]含有两个类的扩展模块
阅读量:6839 次
发布时间:2019-06-26

本文共 2792 字,大约阅读时间需要 9 分钟。

在我们写扩展时,就像YAF不会是用一个类文件来完成一个扩展功能,所以我们要在一个扩展模块里调起几个类的实例,同类之间的方法,可以相互调用,不同类之间的实例,应该也可以调用,下面我们就用一个例子来说明。首先我们先创建play扩展模块,再创建adf扩展模块,最后创建udf扩展模块,我们要做到的是php -m中显示加载了play,我们可以调用adf类和udf类。
第一步:    在adf和udf类中各实现set get方法,然后初始化minit中的内容    运行成功后,将adf.c php_adf.h和udf.c php_udf.h拷入play文件中第二步修改play文件夹中的config.m4:if test -z "$PHP_DEBUG" ; then   PHP_NEW_EXTENSION(play, play.c udf.c adf.c, $ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)在play.c的MINIT函数中加上    ZEND_MODULE_STARTUP_N(udf) (INIT_FUNC_ARGS_PASSTHRU); ZEND_MODULE_STARTUP_N(adf) (INIT_FUNC_ARGS_PASSTHRU); 第三步执行 phpize ./configure --with-php-config=/usr/bin/php-config --enable-debug make && make install
adf.c zend_class_entry *adf_ce;//新增定义ZEND_BEGIN_ARG_INFO_EX(global_setkey_arg, 0, 0, 2)    ZEND_ARG_INFO(0, key1)    ZEND_ARG_INFO(0, key2) ZEND_END_ARG_INFO() ZEND_METHOD(adf,__construct){ RETURN_NULL(); } ZEND_METHOD(adf,set){ zval *param1; zval *param2; array_init(param2); //int zend_parse_parameters ( int num_args TSRMLS_DC, char* type_spec, ... ) if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|z",&param1,&param2) == FAILURE) { RETURN_FALSE; } zend_update_property(adf_ce, getThis(), "param1", sizeof("param1")-1, param1 TSRMLS_CC); zend_update_property(adf_ce, getThis(), "param2", sizeof("param2")-1, param2 TSRMLS_CC); RETURN_NULL(); } ZEND_METHOD(adf,get){ array_init(return_value); zval *get1; zval *get2; zval param1; //php >=7.0 zval param2; //php >=7.0 get1 = zend_read_property(adf_ce, getThis(), "param1", sizeof("param1")-1, 0, &param1 TSRMLS_DC); get2 = zend_read_property(adf_ce, getThis(), "param2", sizeof("param2")-1, 0, &param2 TSRMLS_DC); add_next_index_string(return_value,Z_STRVAL_P(get1)); add_next_index_string(return_value,Z_STRVAL_P(get2)); //add_assoc_string(return_value, "param1", ZEND_STRL("test1")); //add_assoc_string(return_value, "param2", ZEND_STRL("test2")); RETURN_ZVAL(return_value, 1, 0); } const zend_function_entry adf_functions[] = { PHP_ME(adf, __construct,NULL,ZEND_ACC_PUBLIC|ZEND_ACC_CTOR) PHP_ME(adf,set,global_setkey_arg,ZEND_ACC_PUBLIC) PHP_ME(adf,get,NULL,ZEND_ACC_PUBLIC) PHP_ME(adf,calladf,NULL,ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) PHP_FE_END /* Must be the last line in adf_functions[] */ }; PHP_MINIT_FUNCTION(adf) { /* If you have INI entries, uncomment these lines REGISTER_INI_ENTRIES(); */ zend_class_entry ce; INIT_CLASS_ENTRY(ce, "adf", adf_functions); adf_ce = zend_register_internal_class(&ce TSRMLS_CC); return SUCCESS; }
play.c中代码:PHP_MINIT_FUNCTION(play){    /* If you have INI entries, uncomment these lines    REGISTER_INI_ENTRIES();    */    ZEND_MODULE_STARTUP_N(udf) (INIT_FUNC_ARGS_PASSTHRU);    ZEND_MODULE_STARTUP_N(adf) (INIT_FUNC_ARGS_PASSTHRU); return SUCCESS; }
  • 请尊重本人劳动成功,可以随意转载但保留以下信息
  • 作者:岁月经年
  • 时间:2016年03月
  • 首发:

转载于:https://www.cnblogs.com/djhull/p/5359650.html

你可能感兴趣的文章
理解并实施:HSRP(CCNA200-120新增考点)
查看>>
【翻译】使用Ext JS设计响应式应用程序
查看>>
检查系统是否已经加载某些特殊AD模块
查看>>
DPM备份时 VdsError:无法扩展该卷,因为群集的数量将超过文件系统支持的最大群集数...
查看>>
黄章会卖掉魅族吗?
查看>>
有米平台上最赚钱的应用是怎样使用积分墙的?
查看>>
微软MCITP系列课程(三)本地用户与组账户的管理
查看>>
使用 StateServer 保存 Session 解决 Session过期,登陆过期问题。
查看>>
ubuntu 10.04.2本机 部署给力百货全过程20110530
查看>>
AutoVBA获取基本图元对象
查看>>
不用服务器也能跑的框架-wojilu-续篇
查看>>
Ubuntu 11.04 x64 下安装Python
查看>>
如果利用xjplugin编写基于web的应用系统
查看>>
ExpandableListActivity的使用
查看>>
C#, XML中有中文加载出错问题的处理
查看>>
Java那些事之正则表达式
查看>>
SQL Server T-SQL高级查询
查看>>
JSON在PHP中的应用
查看>>
判断是否联网
查看>>
私有化构造方法
查看>>