PHP擴展遷移為兼容PHP7記錄

碼頭工人 8年前發布 | 30K 次閱讀 PHP PHP開發

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記錄,轉載請注明來源!

 本文由用戶 碼頭工人 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!