PHP_ARG_WITH或者PHP_ARG_ENABLE指定了PHP模組的工作方式,任選一種,我選擇的是WITH
PHP_REQUIRE_CXX用於指定這個擴充用到了C++
PHP_SUBST(EXTERN_NAME_SHARED_LIBADD)用於說明這個擴充編譯成動態連結程式庫的形式
PHP_ADD_LIBRARY(stdc++,"",SYSFILE_SHARED_LIBADD)用於將標準C++庫連結進入擴充
PHP_NEW_EXTENSION用於指定有哪些源檔案應該被編譯,檔案和檔案之間用空格隔開
ext_skel預設產生的模組架構是針對C的,我們要使用C++, 那以上的3,5兩個宏就是必須的.另外還要把testext.c改名成testext.cpp,所以PHP_NEW_EXTENSION原本包括的testext.c也要修改.
在使用C++之後要注意一個小問題,那就是php_testext.h這個檔案可能被PHP的其他部分所引用到,而引用者很可能是一個.c檔案,所以不能在php_testext.h裡包含任何C++所專屬的東西.比如標準模版庫,類,或者bool類型等等.
默 認產生的testext.c(現在改名為testext.cpp)了,已經包含了一個測試性質的匯出函數,通過那個例子就可以大概明白怎麼添加自己的函數 了. zend_function_entry是匯出函數列表, zend_module_entry描述了模組的資訊. 不過因為是C++了,還是有幾點要修改的:
#include "php.h" #include "php_ini.h" #include "ext/standard/info.h"
要用extern "C" 修飾.
ZEND_GET_MODULE也要用extern "C"修飾
zend_module_entry就是用於描述模組資訊的類型,其實就是一個結構,其中第二項不知道是什麼含意.在Windows上,這好像是一個描述資訊,可以是一個長長的字串,但是在Linux上似乎只能是跟模組名相同.
之後的工作就是寫自己的代碼了.根據設計,提供對外的介面函數,然後寫C/C++代碼來實現.