国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > 建站經驗 > 正文

PHP擴展遷移為PHP7擴展兼容性問題記錄

2024-04-25 20:16:36
字體:
來源:轉載
供稿:網友

PHP7擴展編寫的時候,提供的一些內核方法和之前的PHP之前的版本并不能完全兼容,有不少方法參數做了調整,下面是在遷移過程中遇到的一些問題,感興趣的朋友參考下吧。

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" 上面加上一行

  1. #include <stdint.h>  
  2. #ifndef INT64_MAX 
  3. # define INT64_MAX INT64_C( 9223372036854775807) 
  4. #endif 
  5. #ifndef INT64_MIN 
  6. # define INT64_MIN (-INT64_C( 9223372036854775807)-1) 
  7. #endif 

解決。

創建類

可以參考mysqli擴展mysqli.c文件中的 mysqli_objects_new 方法。

變量聲明從堆上分配,改為棧上分配。

如,原先代碼為

  1. zval* sarray_l; 
  2. ALLOC_INIT_ZVAL(sarray_l); 
  3. array_init(sarray_l); 

改為

  1. zval sarray_l; 
  2. array_init(&sarray_l); 
  3. 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()宏方法,代碼如下:

  1. zend_string *str; 
  2. char *sptr; 
  3. ..... 
  4. 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' 在此作用域中尚未聲明

增加如下代碼:

  1. static inline hsf_object *hsf_fetch_object(zend_object *obj) /* {{{ */ { 
  2. return (user_object *)((char*)(obj) - XtOffsetOf(user_object, std)); 
  3. /* }}} */ 
  4. #define Z_USEROBJ_P(zv) hsf_fetch_object(Z_OBJ_P((zv))) 

然后把zend_object_store_get_object改為Z_USEROBJ_P即可。

注意,user_object是你定義的結構體。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 古浪县| 怀远县| 大洼县| 邵阳县| 星子县| 惠州市| 乐陵市| 邓州市| 竹山县| 竹溪县| 嘉义市| 武川县| 万荣县| 探索| 容城县| 南雄市| 始兴县| 鄂温| 措勤县| 乐昌市| 保亭| 宜章县| 桃园市| 榆树市| 陕西省| 德江县| 富裕县| 中方县| 威信县| 丹东市| 通城县| 达州市| 定边县| 成安县| 蒲江县| 友谊县| 荥阳市| 阜城县| 冷水江市| 类乌齐县| 罗山县|