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中批量删除Mysql中相同前缀的数据表的代码
Jul 01 PHP
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
May 07 PHP
强烈声明: 不要使用(include/require)_once
Jun 06 PHP
php获取mysql字段名称和其它信息的例子
Apr 14 PHP
mac环境中使用brew安装php5.5.15
Aug 18 PHP
php中字符串和正则表达式详解
Oct 23 PHP
PHP读取txt文本文件并分页显示的方法
Mar 11 PHP
PHP使用ODBC连接数据库的方法
Jul 18 PHP
基于CI框架的微信网页授权库示例
Nov 25 PHP
PHP微信公众号开发之微信红包实现方法分析
Jul 14 PHP
基于php双引号中访问数组元素报错的解决方法
Feb 01 PHP
PHP+ajax实现获取新闻数据简单示例
May 08 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 面向对象实现代码
2009/11/11 PHP
一步一步学习PHP(4) php 函数 补充2
2010/02/15 PHP
php中的静态变量的基本用法
2014/03/20 PHP
PHP构造函数与析构函数用法示例
2016/09/28 PHP
PHP实现移除数组中为空或为某值元素的方法
2017/01/07 PHP
yii2实现 &quot;上一篇,下一篇&quot; 功能的代码实例
2017/02/04 PHP
php中青蛙跳台阶的问题解决方法
2018/10/14 PHP
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
2009/02/14 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
网页打开自动最大化的js代码
2012/08/22 Javascript
jQuery随便控制任意div隐藏的方法
2013/06/28 Javascript
js解决弹窗问题实现班级跳转DIV示例
2014/01/06 Javascript
一个JavaScript去除字符串末尾的空白实例代码
2014/09/22 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
JQuery在循环中绑定事件的问题详解
2016/06/02 Javascript
jQuery实现查找最近父节点的方法
2016/06/23 Javascript
js重写方法的简单实现
2016/07/10 Javascript
Google 爬虫如何抓取 JavaScript 的内容
2017/04/07 Javascript
jQuery tip提示插件(实例分享)
2017/04/28 jQuery
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
2018/05/17 Javascript
layui点击导航栏刷新tab页的示例代码
2018/08/14 Javascript
深入解析ES6中的promise
2018/11/08 Javascript
详解javascript中的Error对象
2019/04/25 Javascript
详解es6新增数组方法简便了哪些操作
2019/05/09 Javascript
微信小程序非跳转式组件授权登录的方法示例
2019/05/22 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
Vue强制组件重新渲染的方法讨论
2020/02/03 Javascript
js数组中去除重复值的几种方法
2020/08/03 Javascript
JS遍历树层级关系实现原理解析
2020/08/31 Javascript
[01:07:17]EG vs Optic Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
面向初学者的Python编辑器Mu
2018/10/08 Python
基于python实现操作redis及消息队列
2020/08/27 Python
个人向公司借款协议书
2014/10/09 职场文书
Python集合的基础操作
2021/11/01 Python
postgresql如何找到表中重复数据的行并删除
2023/05/08 MySQL