PHP扩展迁移为PHP7扩展兼容性问题记录


Posted in PHP onFebruary 15, 2016

PHP7扩展编写的时候,提供的一些内核方法和之前的PHP之前的版本并不能完全兼容。有不少方法参数做了调整。下面是在迁移过程中遇到的一些问题。记录下来,避免大家再踩坑。

add_assoc_stringl

方法参数改为四个。

add_assoc_stringl(parray, key, value, value_len);

迁移的时候,只要把最后一个参数删除即可。

add_assoc_string

方法参数从四个改为了三个。

add_assoc_stringl(parray, key, value);

迁移的时候,只要把最后一个参数删除即可。

add_next_index_stringl

方法参数从四个改为了三个。

add_next_index_stringl(parray, value, value_len);

迁移的时候,只要把最后一个参数删除即可。

add_next_index_string

方法参数从三个改为了两个。

add_next_index_string(parray, value);

迁移的时候,只要把最后一个参数删除即可。

RETURN_STRINGL

方法参数从三个改为了二个。

RETURN_STRINGL(value, length);

迁移的时候,只要把最后一个参数删除即可。

错误:‘INT64_MAX' 在此作用域中尚未声明

原因为深入研究。在 #include "php.h" 上面加上一行

#include <stdint.h> 
#ifndef INT64_MAX
# define INT64_MAX INT64_C( 9223372036854775807)
#endif
#ifndef INT64_MIN
# define INT64_MIN (-INT64_C( 9223372036854775807)-1)
#endif

解决。

创建类

可以参考mysqli扩展mysqli.c文件中的 mysqli_objects_new 方法。

变量声明从堆上分配,改为栈上分配。

如,原先代码为

zval* sarray_l;
ALLOC_INIT_ZVAL(sarray_l);
array_init(sarray_l);

改为

zval sarray_l;
array_init(&sarray_l);
zend_hash_get_current_key_ex

方法参数从六个改为了四个。

ZEND_API int ZEND_FASTCALL zend_hash_get_current_key_ex(const HashTable *ht, zend_string **str_index, zend_ulong *num_index, HashPosition *pos);

迁移的时候,只要把第三个和第五个参数删除即可。

错误:‘Z_TYPE_PP' 在此作用域中尚未声明

已经没有Z_TYPE_PP宏,只有Z_TYPE 和Z_TYPE_P宏方法的定义。

h2错误:不能从 ‘zend_string*' 转换到 ‘const char*'

PHP7中对于字符串的处理使用zend_string进行存储。如果想把zend_string 转为 const char 。需要使用 ZSTR_VAL()宏方法。代码如下:

zend_string *str;
char *sptr;
.....
sptr = ZSTR_VAL(str);

错误:‘IS_BOOL' 在此作用域中尚未声明

已经没有IS_BOOL类型。而是分为了IS_TRUE 和 IS_FALSE.

错误:‘Z_BVAL' 在此作用域中尚未声明

已经没有Z_BVAL宏。但是可以通过类型是否是 IS_TRUE和IS_FALSE来判定。

如果类型为IS_TRUE,则值为true。如果类型为IS_FALSE则值为false。

错误:‘zend_object_store_get_object' 在此作用域中尚未声明

增加如下代码:

static inline hsf_object *hsf_fetch_object(zend_object *obj) /* {{{ */ {
return (user_object *)((char*)(obj) - XtOffsetOf(user_object, std));
}
/* }}} */
#define Z_USEROBJ_P(zv) hsf_fetch_object(Z_OBJ_P((zv)))

然后把zend_object_store_get_object改为Z_USEROBJ_P即可。

注意,user_object是你定义的结构体。

以上所述是针对PHP扩展迁移为PHP7扩展兼容性问题记录的相关叙述,希望对大家有所帮助。

PHP 相关文章推荐
php环境配置 php5 MySQL5 apache2 phpmyadmin安装与配置图文教程
Mar 16 PHP
php下通过POST还是GET来传值
Jun 05 PHP
PHP 开发环境配置(Zend Server安装)
Apr 28 PHP
php空间不支持socket但支持curl时recaptcha的用法
Nov 07 PHP
php实现图片缩放功能类
Dec 18 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
Sep 22 PHP
thinkphp模板的包含与渲染实例分析
Nov 26 PHP
php生成html文件方法总结
Dec 01 PHP
PHP几个实用自定义函数小结
Jan 25 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
Oct 09 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
Nov 18 PHP
thinkPHP5框架实现基于ajax的分页功能示例
Jun 12 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
Feb 15 #PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
Feb 14 #PHP
php socket通信(tcp/udp)实例分析
Feb 14 #PHP
PHP检测用户是否关闭浏览器的方法
Feb 14 #PHP
php中的常用魔术方法汇总
Feb 14 #PHP
详解php魔术方法(Magic methods)的使用方法
Feb 14 #PHP
PHP浮点比较大小的方法
Feb 14 #PHP
You might like
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
PHP强制转化的形式整理
2020/05/22 PHP
理解Javascript_12_执行模型浅析
2010/10/18 Javascript
js 获取后台的字段 改变 checkbox的被选中的状态 代码
2013/06/05 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
2014/01/13 Javascript
仿百度联盟对联广告实现代码
2014/08/30 Javascript
node.js中的fs.link方法使用说明
2014/12/15 Javascript
jQuery实现模拟marquee标签效果
2015/07/14 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
2015/08/04 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
详解vue 配合vue-resource调用接口获取数据
2017/06/22 Javascript
简单快速的实现js计算器功能
2017/08/17 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
2019/04/19 Javascript
JQuery中的常用事件、对象属性与使用方法分析
2019/12/23 jQuery
js绘制一条直线并旋转45度
2020/08/21 Javascript
PyQt5每天必学之滑块控件QSlider
2018/04/20 Python
Python基于whois模块简单识别网站域名及所有者的方法
2018/04/23 Python
如何使用python爬虫爬取要登陆的网站
2019/07/12 Python
python实现回旋矩阵方式(旋转矩阵)
2019/12/04 Python
python实现视频读取和转化图片
2019/12/10 Python
Python3监控疫情的完整代码
2020/02/20 Python
pycharm + django跨域无提示的解决方法
2020/12/06 Python
css3.0新属性效果在ie下的解决方案
2010/05/10 HTML / CSS
Canvas中设置width与height的问题浅析
2018/11/01 HTML / CSS
玖熙女鞋美国官网:Nine West
2016/10/06 全球购物
Canon佳能美国官方商店:购买数码相机、数码单反相机、镜头和打印机
2016/11/15 全球购物
世界顶级足球门票网站:Live Football Tickets
2017/10/14 全球购物
软件测试面试题
2014/01/05 面试题
历史学专业个人的自我评价
2013/10/13 职场文书
8和9的加减法教学反思
2014/05/01 职场文书
学生会干部自我鉴定2014
2014/09/18 职场文书
乡镇科协工作总结2015
2015/05/19 职场文书
天气温馨提示语
2015/07/14 职场文书
护理专业毕业自我鉴定
2019/08/12 职场文书
javascript的setTimeout()使用方法总结
2021/11/20 Javascript
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏