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> #ifndefINT64_MAX #defineINT64_MAXINT64_C(9223372036854775807) #endif #ifndefINT64_MIN #defineINT64_MIN(-INT64_C(9223372036854775807)-1) #endif
解决。
创建类
可以参考mysqli扩展mysqli.c文件中的mysqli_objects_new方法。
变量声明从堆上分配,改为栈上分配。
如,原先代码为
zval*sarray_l; ALLOC_INIT_ZVAL(sarray_l); array_init(sarray_l);
改为
zvalsarray_l; array_init(&sarray_l); zend_hash_get_current_key_ex
方法参数从六个改为了四个。
ZEND_APIintZEND_FASTCALLzend_hash_get_current_key_ex(constHashTable*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*'转换到‘constchar*'
PHP7中对于字符串的处理使用zend_string进行存储。如果想把zend_string转为constchar。需要使用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'在此作用域中尚未声明
增加如下代码:
staticinlinehsf_object*hsf_fetch_object(zend_object*obj)/*{{{*/{ return(user_object*)((char*)(obj)-XtOffsetOf(user_object,std)); } /*}}}*/ #defineZ_USEROBJ_P(zv)hsf_fetch_object(Z_OBJ_P((zv)))
然后把zend_object_store_get_object改为Z_USEROBJ_P即可。
注意,user_object是你定义的结构体。
以上所述是针对PHP扩展迁移为PHP7扩展兼容性问题记录的相关叙述,希望对大家有所帮助。