• 技术文章 >后端开发 >php教程

    PHP扩展迁移为兼容PHP7记录

    2016-06-20 12:39:31原创262
    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  #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记录,转载请注明来源!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:nginx部署多个域名问题 下一篇:Debian 宣布即将升级到 PHP 7
    Web大前端开发直播班

    相关文章推荐

    • php摘引详解,php引用传递使用,php引用方法返回,php引用分析• php佯装来路• PHP学习MVC解决办法• 十 位顶级 PHP 大师的开发原则• 给PHP菜鸟的一些建议及书籍参考指导

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网