PHP擴(kuò)展遷移為PHP7擴(kuò)展兼容性問(wèn)題記錄
PHP7擴(kuò)展編寫的時(shí)候,提供的一些內(nèi)核方法和之前的PHP之前的版本并不能完全兼容。有不少方法參數(shù)做了調(diào)整。下面是在遷移過(guò)程中遇到的一些問(wèn)題。記錄下來(lái),避免大家再踩坑。
add_assoc_stringl
方法參數(shù)改為四個(gè)。
add_assoc_stringl(parray, key, value, value_len);
遷移的時(shí)候,只要把最后一個(gè)參數(shù)刪除即可。
add_assoc_string
方法參數(shù)從四個(gè)改為了三個(gè)。
add_assoc_stringl(parray, key, value);
遷移的時(shí)候,只要把最后一個(gè)參數(shù)刪除即可。
add_next_index_stringl
方法參數(shù)從四個(gè)改為了三個(gè)。
add_next_index_stringl(parray, value, value_len);
遷移的時(shí)候,只要把最后一個(gè)參數(shù)刪除即可。
add_next_index_string
方法參數(shù)從三個(gè)改為了兩個(gè)。
add_next_index_string(parray, value);
遷移的時(shí)候,只要把最后一個(gè)參數(shù)刪除即可。
RETURN_STRINGL
方法參數(shù)從三個(gè)改為了二個(gè)。
RETURN_STRINGL(value, length);
遷移的時(shí)候,只要把最后一個(gè)參數(shù)刪除即可。
錯(cuò)誤:‘INT64_MAX' 在此作用域中尚未聲明
原因?yàn)樯钊胙芯?。?#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
解決。
創(chuàng)建類
可以參考mysqli擴(kuò)展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
方法參數(shù)從六個(gè)改為了四個(gè)。
ZEND_API int ZEND_FASTCALL zend_hash_get_current_key_ex(const HashTable *ht, zend_string **str_index, zend_ulong *num_index, HashPosition *pos);
遷移的時(shí)候,只要把第三個(gè)和第五個(gè)參數(shù)刪除即可。
錯(cuò)誤:‘Z_TYPE_PP' 在此作用域中尚未聲明
已經(jīng)沒(méi)有Z_TYPE_PP宏,只有Z_TYPE 和Z_TYPE_P宏方法的定義。
h2錯(cuò)誤:不能從 ‘zend_string*' 轉(zhuǎn)換到 ‘const char*'
PHP7中對(duì)于字符串的處理使用zend_string進(jìn)行存儲(chǔ)。如果想把zend_string 轉(zhuǎn)為 const char 。需要使用 ZSTR_VAL()宏方法。代碼如下:
zend_string *str; char *sptr; ..... sptr = ZSTR_VAL(str);
錯(cuò)誤:‘IS_BOOL' 在此作用域中尚未聲明
已經(jīng)沒(méi)有IS_BOOL類型。而是分為了IS_TRUE 和 IS_FALSE.
錯(cuò)誤:‘Z_BVAL' 在此作用域中尚未聲明
已經(jīng)沒(méi)有Z_BVAL宏。但是可以通過(guò)類型是否是 IS_TRUE和IS_FALSE來(lái)判定。
如果類型為IS_TRUE,則值為true。如果類型為IS_FALSE則值為false。
錯(cuò)誤:‘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是你定義的結(jié)構(gòu)體。
以上所述是針對(duì)PHP擴(kuò)展遷移為PHP7擴(kuò)展兼容性問(wèn)題記錄的相關(guān)敘述,希望對(duì)大家有所幫助。
- CentOS 7下部署php7.1和開(kāi)啟MySQL擴(kuò)展的方法教程
- yum命令安裝php7和相關(guān)擴(kuò)展
- PHP7安裝Redis擴(kuò)展教程【Linux與Windows平臺(tái)】
- linux平臺(tái)編譯安裝PHP7并安裝Redis擴(kuò)展與Swoole擴(kuò)展實(shí)例教程
- php7安裝yar擴(kuò)展的方法詳解
- php7安裝mongoDB擴(kuò)展的方法分析
- PHP7擴(kuò)展開(kāi)發(fā)教程之Hello World實(shí)現(xiàn)方法示例
- PHP7擴(kuò)展開(kāi)發(fā)之hello word實(shí)現(xiàn)方法詳解
- PHP7擴(kuò)展開(kāi)發(fā)之基于函數(shù)方式使用lib庫(kù)的方法詳解
相關(guān)文章
Ajax提交表單時(shí)驗(yàn)證碼自動(dòng)驗(yàn)證 php后端驗(yàn)證碼檢測(cè)
Ajax提交表單時(shí)實(shí)現(xiàn)驗(yàn)證碼自動(dòng)驗(yàn)證,驗(yàn)證碼先檢測(cè)正確性,不正確則不提交表單,更新驗(yàn)證碼,php后端驗(yàn)證碼檢測(cè),感興趣的小伙伴們可以參考一下2016-07-07laravel excel 上傳文件保存到本地服務(wù)器功能
今天小編就為大家分享一篇laravel excel 上傳文件保存到本地服務(wù)器功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11Laravel使用Caching緩存數(shù)據(jù)減輕數(shù)據(jù)庫(kù)查詢壓力的方法
這篇文章主要介紹了Laravel使用Caching緩存數(shù)據(jù)減輕數(shù)據(jù)庫(kù)查詢壓力的方法,以項(xiàng)目實(shí)例形式較為詳細(xì)的分析了Laravel框架使用Caching緩存的原理與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-03-03ThinkPHP整合datatables實(shí)現(xiàn)服務(wù)端分頁(yè)的示例代碼
下面小編就為大家分享一篇ThinkPHP整合datatables實(shí)現(xiàn)服務(wù)端分頁(yè)的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02