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扩展迁移为PHP7扩展兼容性问题记录的更多相关文章

  1. iOS 6 API和向后兼容性

    可以在支持早期iOS版本的应用中使用iOS6中引入的API和框架吗?这只能通过解决方法和代码来实现,例如:或者我可以在支持早期版本的iOS而不指定版本的应用程序中使用更新的框架,API等?而且,我能否使用Xcode4.5,还是要坚持现在的公开发行版?

  2. ios – Swift 4向后兼容性

    一起使用.有没有办法在两个版本的Xcode中使这个工作?Swift4是否应该向后兼容?

  3. 译:Swift ABI (一)

    作为Swift社区的一份资源,这份文档也为SwiftABI的发展指明了方向。这些内容记录了和SwiftABI相关的工程和设计任务。在运行时,通过Swift编写的二进制程序通过ABI和其他的程序库或组件进行交互。但Swift是一门和C截然不同的语言,它需要为每一种平台定义自己的ABI。而这份文档中中的绝大部分内容都是和平台无关的,和具体平台相关的考量会影响到SwiftABI的设计和实现细节。

  4. 苹果公司揭秘首批列入 Swift 源代码兼容性开源项目清单

    源代码兼容性是Swift未来的目标。为了实现这一目标,建立了一个源兼容性测试套件,用于根据Swift源代码语料库对编译器进行回归测试更改。添加向项目模板等更多内容请查看Swift官方网站

  5. Swift 3 iOS兼容性

    所以现在我使用Swift3,默认情况下部署目标设置为iOS10.0这意味着我将无法使其运行在例如iOS8-9?“CosinSwift3我使用新的功能,在后来的操作系统中不可用您可以在iOS8&9将DeploymentTarget设置为其中一个版本。Swift3.x与iOS8兼容较新。与Swift2.2的唯一区别是您必须使用Xcode8。当您将部署目标设置为比iOS10更早版本的应用程序时,您应该意识到不能使用iOS10中新增的API,但使用Swift3应该没有问题。编辑:您现在可以使用Xcode8.0GM

  6. Android P预览上的Espresso测试:检测到API兼容性错误的问题

    我正在使用Espresso进行仪器测试并在AndroidPreviewPEmulator上运行它们.我的测试类中有5个测试用例,其中一个测试在运行测试套件时失败并得到以下错误.DetectedproblemswithAPIcompatibility失败的测试用例在单独运行而不是在套件中运行时通过.由于对话框显示在显示检测到的API兼容性问题的视图上,因此在层次结构异常中找不到匹配的视图以及上述错误

  7. android – 如果最低SDK = 14,则为Lollipop提供Appcompat,兼容性和支持库

    我们有一个现有的Android应用程序支持最高级别为18的API级别.我们使用了兼容性库19.1.0.现在我们正在改变/升级到:>最低SDK=14>目标=android-22现在假设有不同版本的v4,v7,v13支持,兼容性和appcompat库,我不确定要包含哪些,哪些不包含.我们使用maven进行依赖管理并使用MavenSDKdeployer解决方法如果您使用的是14的minSDK,那么从技术

  8. 使用Android API Level 15时如何保持向后兼容性?

    冰淇淋三明治介绍了很多新的UI设计元素,但市场渗透率仍然只有4%左右.如果想要面向未来的应用程序,并利用Honeycomb/IceCreamSandwich引入的一些设计元素,例如动作栏,配色方案等,那么确保您保持一些向后的方式是最好的方法兼容性?解决方法虽然我同意@OllieC,我认为除了使用ActionbarSherlock图书馆之外,还有其他选择可以添加,而这个我会积极参与ABS社区,并同意

  9. PHP7中I/O模型内核剖析详解

    在本篇内容中小编给大家整理了关于PHP7中I/O模型内核的相关知识点内容,有需要的朋友们跟着学习下。

  10. PHP7匿名类的用法示例

    这篇文章主要介绍了PHP7匿名类的用法,结合实例形式分析了php7匿名类、匿名函数简单定义与使用技巧,需要的朋友可以参考下

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部