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 相关文章推荐
利用 window_onload 实现select默认选择
Oct 09 PHP
php简单提示框alert封装函数
Aug 08 PHP
Apache中php.ini的设置方法
Feb 28 PHP
Memcached常用命令以及使用说明详解
Jun 27 PHP
分割GBK中文遭遇乱码的解决方法
Aug 09 PHP
php按字符无乱码截取中文的方法
Mar 27 PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
Dec 07 PHP
PHPExcel 修改已存在Excel的方法
May 03 PHP
PHP中实现中文字串截取无乱码的解决方法
May 29 PHP
Yii 框架控制器创建使用及控制器响应操作示例
Oct 14 PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
Oct 17 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
Sep 25 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
Codeigniter发送邮件的方法
2015/03/19 PHP
根据身份证号自动输出相关信息(籍贯,出身日期,性别)
2013/11/15 Javascript
JS批量操作CSS属性详细解析
2013/12/16 Javascript
判断一个对象是否为jquery对象的方法
2014/03/12 Javascript
JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍
2014/04/03 Javascript
extjs 时间范围选择自动判断的实现代码
2014/06/24 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
JS基于面向对象实现的拖拽库实例
2015/09/24 Javascript
JavaScript判断对象是否为数组
2015/12/22 Javascript
jQuery fancybox在ie浏览器下无法显示关闭按钮的解决办法
2016/02/19 Javascript
JS Array创建及concat()split()slice()的使用方法
2016/06/03 Javascript
jQuery新窗口打开外链接
2016/07/21 Javascript
jQuery实现点击行选中或取消CheckBox的方法
2016/08/01 Javascript
详解Vue.js——60分钟组件快速入门(上篇)
2016/12/05 Javascript
微信小程序 本地数据存储实例详解
2017/04/13 Javascript
详解JavaScript中操作符和表达式
2018/09/12 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
微信小程序背景音乐开发详解
2019/12/12 Javascript
vue 调用 RESTful风格接口操作
2020/08/11 Javascript
JS highcharts动态柱状图原理及实现
2020/10/16 Javascript
解决python大批量读写.doc文件的问题
2018/05/08 Python
python删除本地夹里重复文件的方法
2020/11/19 Python
python2.x实现人民币转大写人民币
2018/06/20 Python
Python 实现数据结构-堆栈和队列的操作方法
2019/07/17 Python
python 哈希表实现简单python字典代码实例
2019/09/27 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
2020/03/11 Python
使用OpenCV对车道进行实时检测的实现示例代码
2020/06/19 Python
Java Unsafe类实现原理及测试代码
2020/09/15 Python
html通过canvas转成base64的方法
2019/07/18 HTML / CSS
基于HTML5 的人脸识别活体认证的实现方法
2016/06/22 HTML / CSS
JAVA中的关键字有什么特点
2014/03/07 面试题
本科毕业生应聘求职信
2014/07/06 职场文书
卖车协议书范例
2014/09/16 职场文书
酒店管理专业毕业生自我鉴定
2014/09/29 职场文书
Python3.10的一些新特性原理分析
2021/09/15 Python
关于JavaScript轮播图的实现
2021/11/20 Javascript