PHP扩展迁移为兼容PHP7记录-阿里云开发者社区

开发者社区> exinnet> 正文

PHP扩展迁移为兼容PHP7记录

简介:
+关注继续查看

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

PHP7扩展开发之hello word

白话PHP7扩展开发之创建对象

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是你定义的结构体。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
惠普(HP) LaserJet Pro M1136 MFP 黑白多功能激光一体机 (打印 复印 扫描)驱动安装记录
惠普(HP) LaserJet Pro M1136 MFP 黑白多功能激光一体机 (打印 复印 扫描) 新入手的打印机,如果没有安装经验,不要急着开箱组装! 先打开电脑,放入驱动光盘,运行安装向导,会有动画安装指南,一步一步的教你如何操作。
752 0
EMR(hadoop/hbase/phoenix夸集群数据迁移采坑记录)
一、概述: Hbase(Phoenix)数据迁移方案主要分为 Hadoop层面(distcp)、及Hbase层面(copyTable、export/import、snapshot) 二、以下针对distcp方案详细说明(以亲测阿里EMR为例): st...
2147 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
4146 0
PHP 代码片段记录
检查URL是否为图片地址 getimagesize() Function check_img($file) { $x = getimagesize($file); switch ($x['mime']) { case "image/gif": $response = 'this is a gif image.
529 0
一次服务器环境搭建的记录(nginx+php+subversion)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengyi_L/article/details/50699523 因同事工作任务比较紧,自己又刚提出离职所以暂时比较闲。
761 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4617 0
ELK日志分析系统迁移记录
写在开始 阿里云ECS即将到期,由于之前ELK日志分析是在自己的服务器上进行试水,断断续续运行了一年多时间。 今天抽空赶紧把ELK迁移一下,由于Logstash本身就配置于各个系统之中,所以这里只是对Redis、Elasticsearch和Kibana进行了配置,当然还有一些邮件发送的配置。
3419 0
mysql+php搜索型注入问题记录
 http://xxx.com/search.php?dy=a%' and 1=1-- 错误 http://xxx.
896 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
3664 0
+关注
exinnet
淘宝技术专家
91
文章
70
问答
文章排行榜
最热
最新