摘要:每一個擴展必須有一個描述對象,在中我們類主要的作用主要完成這個功能。表示我們擴展導出符號給其他庫使用。文章使用的編程文檔的引用連接參考手冊參考手冊原文鏈接開發(fā)擴展之模塊入口定義
zendAPI 項目不提供任何底層的功能,只是封裝了 zend engine 提供的功能,對上提供一個易用的編程接口。這篇文章中,我們將介紹 C++ 世界與 C 世界交匯的地方,在這里也是 zendAPI 的接口與 zend engine 進行整合的地方,非常重要。
每一個 PHP 擴展必須有一個描述對象,在 zendAPI 中我們 zapi::lang::Extension 類主要的作用主要完成這個功能。現在我們來看一個最簡單的 zendAPI 項目的入口文件長什么樣子:
#include "zapi/ZendApi.h" extern "C" { ZAPI_DECL_EXPORT void *get_module() { static zapi::lang::Extension hellozapi("hellozapi", "1.0"); return hellozapi; } }
怎么樣很簡單吧,一個空的 PHP 擴展就完成了,現在我們就詳細解釋下每行的作用。
?#include "zapi/ZendApi.h"
在開發(fā)基于 zendAPI 的項目時候,我們只需要包含這個頭文件就可以了,在這個頭文件中,我們會引入 zendAPI 日常開發(fā)需要的必要的頭文件,您不用自己一個一個自己去引入。
?extern "C" {}
在 CPP 代碼與 C 代碼進行連接的時候我們一般會加上 extern wrapper, 因為如果不加的話 CPP 編譯器會對函數名稱進行 name mangling,這個會導致連接的時候提示符號不存在的錯誤。
?ZAPI_DECL_EXPORT void *get_module();
ZAPI_DECL_EXPORT 表示我們擴展導出符號 get_module 給其他庫使用。函數 get_module 這個函數非常重要,他是 zendAPI 與 zend engine 進行集成的入口,我們必須在這個函數中設置好我們擴展的一切,然后將擴展描述對象的指針返回。
在這里我先簡單描述下 PHP 加載擴展這部分的過程:
在 PHP 初始化的過程中調用的函數有:(這里我們以 cli SAPI 為例進行說明)
php_cli_startup
php_module_startup
php_ini_register_extensions
php_load_extension
get_module = (zend_module_entry ()(void)) DL_FETCH_SYMBOL(handle, "_get_module");
調用 get_module,獲取?zend_module_entry 對象指針
簡單來說我們可以這樣理解,在 PHP 模塊初始化的時候,PHP 會去讀取我們在 php.ini 文件中注冊的擴展, 比如咱們的 hellozapi 就在 php.ini 注冊了一行 extension=hellozapi.so。如果相關的擴展文件存在,PHP 使用 ?dlopen 平臺接口進行動態(tài)加載,成功的話, 獲取 _get_module 符號,然后進行調用,最終獲取一個 ?zend_module_entry 指針。
static zapi::lang::Extension hellozapi("hellozapi", "1.0");
這行代碼實例化一個擴展對象,第一個參數是咱們的擴展的名稱,一般需要跟在 CMake 腳本中定義的項目名字保持一致,第二個參數指定擴展的版本號,這里我們定義為 1.0,這些信息我們都可以在 PHP 腳本中通過反射技術獲取同時也會出現在 phpinfo() 函數的輸出中。
特別提醒:這里的 static 關鍵字不能去掉,去掉了我們就返回了一個懸空指針。(dangle pointer)
return hellozapi;
新手可能會有疑問,我們的 get_module 明明是返回一個 void *,而我們這里返回 zapi::lang::Extension 對象怎么也可以啊 ?原理很簡單,因為我們的 zapi::lang::Extension 定義了一個轉換運算符,C++ 編譯器會自動進行類型轉換。
到這里,我們這個空的 PHP 擴展就完成了,怎么樣,簡單吧?休息一下我們繼續(xù)。
文章使用的編程文檔的引用連接ZAPI_DECL_EXPORT 參考手冊
zapi::lang::Extension 參考手冊
原文鏈接: C++ 開發(fā) PHP 7 擴展之模塊入口定義
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25938.html
摘要:比如擴展的那么我們必須也在我們擴展中也定義幾個常量玩玩啊,其實真的很簡單,不信那咱們走著看。好了,到這里我們就把預定義常量就講完了,我沒有騙您吧,真的很簡單,稍作調整讓我們繼續(xù)前進原文鏈接開發(fā)擴展之定義常量 大家如果經常閱讀 PHP 官方手冊的話會發(fā)現,在擴展那一章里面的每個擴展的介紹的時候,都有一節(jié)是 Predefined Constants 預定義常量,這些常量是不需要您在 PHP...
摘要:大家如果經常閱讀官方手冊的話會發(fā)現,在擴展那一章里面的每個擴展的介紹的時候,都有一節(jié)是預定義常量,這些常量是不需要您在里面進行定義就可以使用的。比如擴展的那么我們必須也在我們擴展中也定義幾個常量玩玩啊,其實真的很簡單,不信那咱們走著看。 大家如果經常閱讀 PHP 官方手冊的話會發(fā)現,在擴展那一章里面的每個擴展的介紹的時候,都有一節(jié)是 Predefined Constants 預定義常量...
摘要:主要是庫文件頭文件文件不一致的問題。定義模塊函數其中函數參數是模塊自身,是傳遞的參數列表,返回值定義了一個整形數,這里會申請空間增加引用計數,交由來管理這個引用。 C++開發(fā)python windows版本的擴展模塊示例測試環(huán)境介紹和準備測試環(huán)境:操作系統(tǒng):windows10Python版本:3.7.0VS版本:vs2015社區(qū)版(免費)相關工具下載:VS版本vs2015社區(qū)版(免費)...
摘要:主要是庫文件頭文件文件不一致的問題。定義模塊函數其中函數參數是模塊自身,是傳遞的參數列表,返回值定義了一個整形數,這里會申請空間增加引用計數,交由來管理這個引用。 C++開發(fā)python windows版本的擴展模塊示例測試環(huán)境介紹和準備測試環(huán)境:操作系統(tǒng):windows10Python版本:3.7.0VS版本:vs2015社區(qū)版(免費)相關工具下載:VS版本vs2015社區(qū)版(免費)...
摘要:第一步打開項目下的文件,在文件中輸入我們的函數的原型聲明代碼。這行代碼注冊一個原型為的函數,當這個函數被執(zhí)行的時候,我們的函數將被運行時調用。原文地址開發(fā)擴展之原生函數定義 在上一篇中我們在hellozapi擴展中我們定義了幾個常量,但是一個有用的擴展,必須得有函數,沒有函數的擴展啥用沒有,如果您覺得定義函數很難的話,您又錯了,zendAPI就是為了讓您生活變得美好而生的,而不會讓事情...
閱讀 3431·2021-10-14 09:42
閱讀 2718·2021-09-08 10:44
閱讀 1300·2021-09-02 10:18
閱讀 3600·2021-08-30 09:43
閱讀 2794·2021-07-29 13:49
閱讀 3719·2019-08-29 17:02
閱讀 1576·2019-08-29 15:09
閱讀 1035·2019-08-29 11:01