zendapi
專案不提供任何底層的功能,只是封裝了zend engine
提供的功能,對上提供乙個易用的程式設計介面。這篇文章中,我們將介紹c++
世界與c
世界交匯的地方,在這裡也是zendapi
的介面與zend engine
進行整合的地方,非常重要。
每乙個php
擴充套件必須有乙個描述物件,在zendapi
中我們zapi::lang::extension
類主要的作用主要完成這個功能。現在我們來看乙個最簡單的zendapi
專案的入口檔案長什麼樣子:
#include "zapi/zendapi.h"
extern "c"
}
怎麼樣很簡單吧,乙個空的php
擴充套件就完成了,現在我們就詳細解釋下每行的作用。
#include "zapi/zendapi.h"
在開發基於zendapi
的專案時候,我們只需要包含這個標頭檔案就可以了,在這個標頭檔案中,我們會引入zendapi
日常開發需要的必要的標頭檔案,您不用自己乙個乙個自己去引入。
extern "c"
{}
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
平台介面進行動態載入,成功的話, 獲取_get_module
符號,然後進行呼叫,最終獲取乙個zend_module_entry
指標。
static zapi::lang::extension hellozapi("hellozapi", "1.0");
return hellozapi;
新手可能會有疑問,我們的get_module
明明是返回乙個void *
,而我們這裡返回zapi::lang::extension
物件怎麼也可以啊 ?原理很簡單,因為我們的zapi::lang::extension
定義了乙個轉換運算子,c++
編譯器會自動進行型別轉換。
到這裡,我們這個空的php
擴充套件就完成了,怎麼樣,簡單吧?休息一下我們繼續。
文章使用的程式設計文件的引用連線
zapi_decl_export 參考手冊zapi::lang::extension 參考手冊
C 開發 PHP 7 擴充套件之定義常量
大家如果經常閱讀php官方手冊的話會發現,在擴充套件那一章裡面的每個擴充套件的介紹的時候,都有一節是predefined constants預定義常量,這些常量是不需要您在php裡面進行定義就可以使用的。比如mysqli擴充套件的 predefined constants 那麼我們必須也在我們hel...
PHP7擴充套件開發之hello word
原文出處 本文是以php7作為基礎,講解如何從零開始建立乙個php擴充套件。本文主要講解建立乙個擴充套件的基本步驟都有哪些。示例中,我們將實現如下功能 echo say 輸出內容 php test.php hello word 在擴充套件中實現乙個say方法,呼叫say方法後,輸出 hello wo...
PHP7擴充套件開發之hello word
echo say 輸出內容 php test.php hello word在擴充套件中實現乙個say方法,呼叫say方法後,輸出 hello word。php為我們提供了生成基本 的工具 ext skel。這個工具在php源 的.ext目錄下。cd php src ext ext skel extn...