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安全配置
Dec 06 PHP
php 友好URL的实现(吐血推荐)
Oct 04 PHP
PHP加速 eAccelerator配置和使用指南
Jun 05 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
Oct 16 PHP
php的mssql数据库连接类实例
Nov 28 PHP
PHP实现从远程下载文件的方法
Mar 12 PHP
php使用timthumb生成缩略图的方法
Jan 22 PHP
PHP常见数组函数用法小结
Mar 21 PHP
使用Zttp简化Guzzle 调用
Jul 02 PHP
php微信开发之音乐回复功能
Jun 14 PHP
PHP7数组的底层实现示例
Aug 25 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 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
我的论坛源代码(六)
2006/10/09 PHP
Discuz 模板引擎的封装类代码
2008/07/18 PHP
php 接口类与抽象类的实际作用
2009/11/26 PHP
php二维数组用键名分组相加实例函数
2013/11/06 PHP
zf框架的校验器InArray使用示例
2014/03/13 PHP
php生成html文件方法总结
2014/12/01 PHP
PHP超牛逼无限极分类生成树方法
2015/05/11 PHP
PHP利用APC模块实现大文件上传进度条的方法
2015/10/29 PHP
php无法连接mysql数据库的正确解决方法
2016/07/01 PHP
JQuery的html(data)方法与&amp;lt;script&amp;gt;脚本块的解决方法
2010/03/09 Javascript
Jquery写一个鼠标拖动效果实现原理与代码
2012/12/24 Javascript
IE下写xml文件的两种方式(fso/saveAs)
2013/08/05 Javascript
jQuery中index()的用法分析
2014/09/05 Javascript
JavaScript设置获取和设置属性的方法
2015/03/04 Javascript
JS获取网页图片name属性的方法
2015/04/01 Javascript
Jquery和angularjs获取check框选中的值的方法汇总
2016/01/17 Javascript
基于JS实现Android,iOS一个手势动画效果
2016/04/27 Javascript
原生js实现节日时间倒计时功能
2017/01/18 Javascript
移动端触屏幻灯片图片切换插件idangerous swiper.js
2017/04/10 Javascript
JavaScript用200行代码制作打飞机小游戏实例
2017/06/21 Javascript
vue axios用法教程详解
2017/07/23 Javascript
layui实现数据表格隐藏列的示例
2019/10/25 Javascript
python动态加载变量示例分享
2014/02/17 Python
python实现文件名批量替换和内容替换
2014/03/20 Python
快速解决pandas.read_csv()乱码的问题
2018/06/15 Python
Python虚拟环境的原理及使用详解
2019/07/02 Python
numpy中的meshgrid函数的使用
2019/07/31 Python
PyCharm2019 安装和配置教程详解附激活码
2020/07/31 Python
Python爬取某平台短视频的方法
2021/02/08 Python
python 多线程爬取壁纸网站的示例
2021/02/20 Python
将一个文本文件的内容按倒序打印出来
2015/01/05 面试题
幽默自我介绍演讲稿
2014/08/21 职场文书
出生证明范本
2015/06/15 职场文书
如何书写邀请函?
2019/06/24 职场文书
教你使用Pandas直接核算Excel中快递费用
2021/05/12 Python
GPU服务器的多用户配置方法
2022/07/07 Servers