当前位置: 首页 > 编程笔记 >

PHP扩展迁移为PHP7扩展兼容性问题记录

程智明
2023-03-14
本文向大家介绍PHP扩展迁移为PHP7扩展兼容性问题记录,包括了PHP扩展迁移为PHP7扩展兼容性问题记录的使用技巧和注意事项,需要的朋友参考一下

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扩展兼容性问题记录的相关叙述,希望对大家有所帮助。

 类似资料:
  • 问题描述 使用 Dockerfile 安装 GD 的过程中,报错 Dockerfile 文件内容: 报错如下 然后我给zlib1g降级 又报错 好像大概是不然使用-y参数吧,但是我去掉了参数还是报错 报错如下 好像是降级需要确认,但是 Dockerfile 中又不能输入Y。 请问如何解决? 搜了半天没有找到方法 1. 运行环境 1). PHP 版本: php:7.3-fpm 2). 当前系统 ma

  • Jooq生成器是否支持扩展提供给生成器的自定义类? 我想生成扩展自定义提供类的记录,该类将扩展TableRecordImpl。 我想进入继承链,其中UpdateableRecordImpl将扩展MyRecord,MyRecord将扩展TableRecordImpl?

  • 目的 测试 OpenSHift 水平弹性扩展,资源限制。 环境 openshift v3.11.16/kubernetes v1.11.0 步骤 创建工程1. CLI 登录到 OCP $ oc login https://master.example.com:8443 -u admin -p admin2. 创建工程 $ oc new-project test-hpa 准备测试镜像 本部分使用测试

  • 扩展说明 服务容器扩展,用于自定义加载内容。 扩展接口 org.apache.dubbo.container.Container 扩展配置 java org.apache.dubbo.container.Main spring jetty log4j 已知扩展 org.apache.dubbo.container.spring.SpringContainer org.apache.dubbo.c

  • 8.1. 定义访问令牌类型 8.2. 定义新的端点参数 8.3. 定义新的授权许可类型 8.4. 定义新的授权端点响应类型 8.5. 定义其他错误代码

  • 我需要减少从Optaplanner获取结果的延迟。是否可以跨集群中的多个实例(和/或机器)运行作业?我似乎找不到实现这一目标的任何信息/尝试。

  • 有两种方法可以定义访问令牌类型 - 通过在访问令牌类型的注册表中注册。 通过使用唯一的绝对URI(统一资源标识符)作为其名称。 定义新的端点参数 参数名称必须遵守参数名称ABNF(Augmented Backus-Naur Form是一种基于Backus-Naur形式的元语言,由其自己的语法和派生规则组成),参数值的语法必须明确定义。 param-name = 1* name-char name-

  • 特定于 Declarative 映射API。 在 1.4 版更改: 绝大多数声明性扩展现在集成到SQLAlchemy ORM中,并且可以从 sqlalchemy.orm 命名空间。请参阅上的文档 声明性映射 对于新文档。有关更改的概述,请参见 声明式现在集成到ORM中,具有新的特性 . Object Name Description AbstractConcreteBase “concrete”声