国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

dabai / 441人閱讀

摘要:每一個擴展必須有一個描述對象,在中我們類主要的作用主要完成這個功能。表示我們擴展導出符號給其他庫使用。文章使用的編程文檔的引用連接參考手冊參考手冊原文鏈接開發(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 這個函數非常重要,他是 zendAPIzend 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

相關文章

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

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

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

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

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

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

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

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

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

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

    asce1885 評論0 收藏0

發(fā)表評論

0條評論

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