《C++ 開發(fā) PHP 7 擴(kuò)展之模塊入口定義》要點(diǎn):
本文介紹了C++ 開發(fā) PHP 7 擴(kuò)展之模塊入口定義,希望對您有用。如果有疑問,可以聯(lián)系我們。
PHP 7 擴(kuò)展之模塊入口定義" />
zendAPI 項目不提供任何底層的功能,只是封裝了 zend engine 提供的功能,對上提供一個易用的編程接口.這篇文章中,我們將介紹 C++ 世界與 C 世界交匯的地方,在這里也是 zendAPI 的接口與 zend engine 進(jìn)行整合的地方,非常重要.
每一個 PHP 擴(kuò)展必須有一個描述對象,在 zendAPI 中我們 zapi::lang::Extension 類主要的作用主要完成這個功能.現(xiàn)在我們來看一個最簡單的 zendAPI 項目的入口文件長什么樣子:
#include "zapi/ZendApi.h"extern "C" { ZAPI_DECL_EXPORT void *get_module() { static zapi::lang::Extension hellozapi("hellozapi", "1.0"); return hellozapi;}}
怎么樣很簡單吧,一個空的 PHP 擴(kuò)展就完成了,現(xiàn)在我們就詳細(xì)解釋下每行的作用.
?#include "zapi/ZendApi.h"
在開發(fā)基于 zendAPI 的項目時候,我們只需要包含這個頭文件就可以了,在這個頭文件中,我們會引入 zendAPI 日常開發(fā)需要的必要的頭文件,您不用自己一個一個自己去引入.
extern "C"{}
在 CPP 代碼與 C 代碼進(jìn)行連接的時候我們一般會加上 extern wrapper, 因為如果不加的話 CPP 編譯器會對函數(shù)名稱進(jìn)行 name mangling,這個會導(dǎo)致連接的時候提示符號不存在的錯誤.
ZAPI_DECL_EXPORT void *get_module();
ZAPI_DECL_EXPORT 表示我們擴(kuò)展導(dǎo)出符號 get_module 給其他庫使用.函數(shù) get_module 這個函數(shù)非常重要,他是 zendAPI 與 zend engine 進(jìn)行集成的入口,我們必須在這個函數(shù)中設(shè)置好我們擴(kuò)展的一切,然后將擴(kuò)展描述對象的指針返回.
在這里我先簡單描述下 PHP 加載擴(kuò)展這部分的過程:
在 PHP 初始化的過程中調(diào)用的函數(shù)有:(這里我們以 cli SAPI 為例進(jìn)行說明)
php_cli_startup
php_module_startup
php_ini_register_extensions
zend_llist_apply
php_load_extension
get_module = (zend_module_entry ()(void)) DL_FETCH_SYMBOL(handle, “_get_module”);
調(diào)用 get_module,獲取?zend_module_entry 對象指針
簡單來說我們可以這樣理解,在 PHP 模塊初始化的時候,PHP 會去讀取我們在 php.ini 文件中注冊的擴(kuò)展, 比如咱們的 hellozapi 就在 php.ini 注冊了一行 extension=hellozapi.so.如果相關(guān)的擴(kuò)展文件存在,PHP 使用 dlopen 平臺接口進(jìn)行動態(tài)加載,成功的話, 獲取 _get_module 符號,然后進(jìn)行調(diào)用,最終獲取一個 zend_module_entry 指針.
static zapi::lang::Extension hellozapi("hellozapi", "1.0");
這行代碼實(shí)例化一個擴(kuò)展對象,第一個參數(shù)是咱們的擴(kuò)展的名稱,一般需要跟在 CMake 腳本中定義的項目名字保持一致,第二個參數(shù)指定擴(kuò)展的版本號,這里我們定義為 1.0,這些信息我們都可以在 PHP 腳本中通過反射技術(shù)獲取同時也會出現(xiàn)在 phpinfo() 函數(shù)的輸出中.
特別提醒:這里的 static 關(guān)鍵字不能去掉,去掉了我們就返回了一個懸空指針.(dangle pointer)
return hellozapi;
新手可能會有疑問,我們的 get_module 明明是返回一個 void *,而我們這里返回 zapi::lang::Extension 對象怎么也可以啊 ?原理很簡單,因為我們的 zapi::lang::Extension 定義了一個轉(zhuǎn)換運(yùn)算符,C++ 編譯器會自動進(jìn)行類型轉(zhuǎn)換.
到這里,我們這個空的 PHP 擴(kuò)展就完成了,怎么樣,簡單吧?休息一下我們繼續(xù).
#文章使用的編程文檔的引用連接
ZAPI_DECL_EXPORT
http://zendapi.org/api/file_compiler_detection_8h.html#1a6483198f166d8060fb07d99604ef1cfe
zapi::lang::Extension
http://zendapi.org/api/classzapi_1_1lang_1_1_extension.html
更多精彩的教程您可以拜訪我們的手冊:www.zendapi.org/manual
歡迎參與《C++ 開發(fā) PHP 7 擴(kuò)展之模塊入口定義》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/9659.html