成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

C++ 開發(fā) PHP 7 擴(kuò)展之模塊入口定義

dabai / 450人閱讀

摘要:每一個擴(kuò)展必須有一個描述對象,在中我們類主要的作用主要完成這個功能。表示我們擴(kuò)展導(dǎo)出符號給其他庫使用。文章使用的編程文檔的引用連接參考手冊參考手冊原文鏈接開發(fā)擴(kuò)展之模塊入口定義

zendAPI 項目不提供任何底層的功能,只是封裝了 zend engine 提供的功能,對上提供一個易用的編程接口。這篇文章中,我們將介紹 C++ 世界與 C 世界交匯的地方,在這里也是 zendAPI 的接口與 zend engine 進(jìn)行整合的地方,非常重要。
每一個 PHP 擴(kuò)展必須有一個描述對象,在 zendAPI 中我們 zapi::lang::Extension 類主要的作用主要完成這個功能?,F(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ù)非常重要,他是 zendAPIzend 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

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");

這行代碼實例化一個擴(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)換運算符,C++ 編譯器會自動進(jìn)行類型轉(zhuǎn)換。

到這里,我們這個空的 PHP 擴(kuò)展就完成了,怎么樣,簡單吧?休息一下我們繼續(xù)。

文章使用的編程文檔的引用連接

ZAPI_DECL_EXPORT 參考手冊
zapi::lang::Extension 參考手冊

原文鏈接: C++ 開發(fā) PHP 7 擴(kuò)展之模塊入口定義

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/25938.html

相關(guān)文章

  • C++ 開發(fā) PHP 7 擴(kuò)展定義常量

    摘要:比如擴(kuò)展的那么我們必須也在我們擴(kuò)展中也定義幾個常量玩玩啊,其實真的很簡單,不信那咱們走著看。好了,到這里我們就把預(yù)定義常量就講完了,我沒有騙您吧,真的很簡單,稍作調(diào)整讓我們繼續(xù)前進(jìn)原文鏈接開發(fā)擴(kuò)展之定義常量 大家如果經(jīng)常閱讀 PHP 官方手冊的話會發(fā)現(xiàn),在擴(kuò)展那一章里面的每個擴(kuò)展的介紹的時候,都有一節(jié)是 Predefined Constants 預(yù)定義常量,這些常量是不需要您在 PHP...

    syoya 評論0 收藏0
  • C++ 開發(fā) PHP 7 擴(kuò)展原生常量定義

    摘要:大家如果經(jīng)常閱讀官方手冊的話會發(fā)現(xiàn),在擴(kuò)展那一章里面的每個擴(kuò)展的介紹的時候,都有一節(jié)是預(yù)定義常量,這些常量是不需要您在里面進(jìn)行定義就可以使用的。比如擴(kuò)展的那么我們必須也在我們擴(kuò)展中也定義幾個常量玩玩啊,其實真的很簡單,不信那咱們走著看。 大家如果經(jīng)常閱讀 PHP 官方手冊的話會發(fā)現(xiàn),在擴(kuò)展那一章里面的每個擴(kuò)展的介紹的時候,都有一節(jié)是 Predefined Constants 預(yù)定義常量...

    zilu 評論0 收藏0
  • C++開發(fā)python windows版本的擴(kuò)展模塊示例

    摘要:主要是庫文件頭文件文件不一致的問題。定義模塊函數(shù)其中函數(shù)參數(shù)是模塊自身,是傳遞的參數(shù)列表,返回值定義了一個整形數(shù),這里會申請空間增加引用計數(shù),交由來管理這個引用。 C++開發(fā)python windows版本的擴(kuò)展模塊示例測試環(huán)境介紹和準(zhǔn)備測試環(huán)境:操作系統(tǒng):windows10Python版本:3.7.0VS版本:vs2015社區(qū)版(免費)相關(guān)工具下載:VS版本vs2015社區(qū)版(免費)...

    junfeng777 評論0 收藏0
  • C++開發(fā)python windows版本的擴(kuò)展模塊示例

    摘要:主要是庫文件頭文件文件不一致的問題。定義模塊函數(shù)其中函數(shù)參數(shù)是模塊自身,是傳遞的參數(shù)列表,返回值定義了一個整形數(shù),這里會申請空間增加引用計數(shù),交由來管理這個引用。 C++開發(fā)python windows版本的擴(kuò)展模塊示例測試環(huán)境介紹和準(zhǔn)備測試環(huán)境:操作系統(tǒng):windows10Python版本:3.7.0VS版本:vs2015社區(qū)版(免費)相關(guān)工具下載:VS版本vs2015社區(qū)版(免費)...

    Meathill 評論0 收藏0
  • C++ 開發(fā) PHP 7 擴(kuò)展原生函數(shù)定義

    摘要:第一步打開項目下的文件,在文件中輸入我們的函數(shù)的原型聲明代碼。這行代碼注冊一個原型為的函數(shù),當(dāng)這個函數(shù)被執(zhí)行的時候,我們的函數(shù)將被運行時調(diào)用。原文地址開發(fā)擴(kuò)展之原生函數(shù)定義 在上一篇中我們在hellozapi擴(kuò)展中我們定義了幾個常量,但是一個有用的擴(kuò)展,必須得有函數(shù),沒有函數(shù)的擴(kuò)展啥用沒有,如果您覺得定義函數(shù)很難的話,您又錯了,zendAPI就是為了讓您生活變得美好而生的,而不會讓事情...

    asce1885 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<