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

原文链接: PHP扩展迁移为兼容PHP7记录 ,转载请注明来源!
时间: 2024-12-29 01:42:22

PHP扩展迁移为兼容PHP7记录的相关文章

ie6,ie7,ie8 css bug兼容解决记录

ie6,ie7,ie8 css bug兼容解决记录 转载自:ie6,ie7,ie8 css bug兼容解决记录 - 前端开发 断断续续的在开发过程中收集了好多的bug以及其解决的办法,都在这个文章里面记录下来了!希望以后解决类似问题的时候能够快速解决 ,也希望大家能在留言里面跟进自己发现的ie6 7 8bug和解决办法! 1:li边距“无故”增加 任何事情都是有原因的,li边距也不例外. 先描述一下具体状况:有些时候li边距会突然增 加很多,值也不固定(只在IE6/IE7有这种现象),让人摸不着

YII2.0.12兼容PHP7.2版本升级

YII2.0.12兼容PHP7.2版本升级 报错信息: FastCGI sent in stderr: "PHP message: PHP Fatal error:  Cannot use ‘Object‘ as class name as it is reserved in /home/leo/htdocs/oa/vendor/yiisoft/yii2/base/Object.php on line 77 这个错误是yii2框架的错误了.也就是说不能使用Object作为类名. 解决方法 1.c

Mysql迁移到Oracle简单记录

因业务的扩展和客户的要求,公司需要将原运行于Mysql上的数据迁移至Oracle. 参加工作的最初几年短暂接触过Mysql,但不经常使用,最初的印象已经所剩无几了. 本文主要记录在数据库迁移过程中,遇到相关问题的解决办法.主要集中于数据类型的选择.部分函数的替代以及其他数据库之间差异的问题. 对于存在相同需求的同学,能够有一点点帮助,我会感到很欣慰 : ) 1.数据类型的选择. 数值类型: Mysql有两种类型的数字:整数(whole number)和实数(real number). 存储整数可

Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查

一.Django项目的创建与介绍 ''' 安装Django #在cmd中输入pip3 #出现这个错误Fatal error in launcher: Unable to create process using '"' #可以直接用 python3 -m pip 代替 pip3 #这个问题是pip3 版本过低直接在cmd中执行 python3 -m pip install --upgrade pip 更新pip3 # 在指定解释器环境下安装django 1.11.9 # 在真实python3环境

使用dva和ant-design组件在IE中的兼容问题记录

参考文章:https://blog.csdn.net/yede0632/article/details/80746264 最近在使用蚂蚁金服的dva脚手架以及ant design组件开发React项目,不得不说dva真的很优秀,很大程度上方便了React项目的开发,尤其需要Redux来管理状态以及处理异步请求,dva帮你集成了大部分你所需要的React组件,并使它们结合使用起来变得简单便捷. 但不可避免地,在开发中也会遇到一些问题,本文就记录下在IE兼容方面遇到的问题以及如何解决. 项目涉及到的

Dom兼容问题记录汇总

DOM方法兼容表   Chrome FireFox IE6 IE7 IE8 IE9 IE10 innerText 支持 不支持(改成了textContent) 支持 支持 支持 支持 支持 innerHTML 支持 支持 支持 支持 支持 支持 支持 textContent 支持  支持  不支持   不支持 不支持   支持  支持                                                                                  

python迁移邮件&lt;仅做记录&gt;

<脚本之初的原因是需要做邮件平移,并且已读,未读的状态一致.所以做了这个脚本> #!/usr/bin/python # -*- coding: utf-8 -*- #Filename: testemail.py import sys import os import imaplib import time import re import cPickle as p command=("status","qianyi","help")

ie兼容问题记录

onchange="this.value=this.value.substring(0, 300)" maxlength标签在ie上不兼容使用事件强制限制长度但用户体验不好 onkeydown="this.value=this.value.substring(0, 300)"  可以根据情况组合事件截取. onkeyup="this.value=this.value.substring(0, 300)" 原文地址:https://www.cnbl

ie6兼容问题记录

1.代码中,em换行写会造成一个空白.去掉em标签之间的空格,不换行.2.利用margin设负值解决ie6下模块被顶换行的bug.3.清除浮动的方法:父元素加overflow:hidden.4.ie6中并列的几个块级元素如div和span,一些没有设置浮动一些设置右浮动,一行的宽度足够放下所有的块级元素,但此时ie6则显示右浮动的其中一块换行了 *可将两部分代码位置交换     缺点:破坏语义 *绝对定位.     优点:不破坏语义.     缺点:代码量加大. *给他们都添加浮动.     优