zoukankan      html  css  js  c++  java
  • 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记录 ,转载请注明来源!
  • 相关阅读:
    ExtJs之表格控件入门
    bootstrap错误警告信息提示
    android采用MVP漫画APP、适配刘海屏、小黄车主界面、录音波浪动画、综合APP等源码
    iOS仿QQ侧滑菜单、登录按钮动画、仿斗鱼直播APP、城市选择器、自动布局等源码
    iOS仿抖音节拍界面、Swift,MVVM架构完整项目、日历demo、滚动切换分类等源码
    接住! 安卓巴士开发者大会花絮第二弹来啦
    iOS漂亮的Toolbar动画、仿美团主页、简易笔记本、流失布局、标签分组等源码
    android仿今日头条App、多种漂亮加载效果、选择器汇总、记事本App、Kotlin开发等源码
    到场率高达96% 这才是高水准技术大会应该有的样子
    iOS动画效果集合、 通过摄像头获取心率、仿淘宝滑动样式、瀑布流、分类切换布局等源码
  • 原文地址:https://www.cnblogs.com/archoncap/p/5141642.html
Copyright © 2011-2022 走看看