本文目錄一覽:
如何在php擴展中封裝一個c++類
首先,要到了Query歸一化的C++版本源代碼。
query歸一化
引用第三方的類庫有兩種方法,一種是靜態引用,一種是動態引用,推薦使用靜態引用,因為靜態引用的情況下,會把類庫打包到php的擴展.SO文件中,這樣我們不必擔心依賴關係,帶着類庫到處跑了。
先用gcc產生.o文件,再用.o產生 最終的靜態庫 .a 文件
gcc -c -fpic queryword.cpp tradmap.cpp transcode.cpp -I . -O2
ar -r libqueryword.a queryword.o tradmap.o transcode.o
上邊圖中有產生的.o 和 .a文件
如果要動態編譯so的話,就是這個:
gcc -c -fpic -O3 queryword.cpp tradmap.cpp transcode.cpp -I .
gcc -shared queryword.o transcode.o tradmap.o -o libqueryword.so
好,現在有了libqueryword.a靜態庫,我們就可以開始做我們的擴展了。
先使用ext_skel工具生成我們框架的骨架.
./ext_skel –extname=queryword
把上邊的靜態庫放到 ./lib 目錄下。
然後修改config.m4文件。
去掉一些注釋符 dnl, 再添加兩行,最後config.m4里,有用的就是這幾行。
PHP_ARG_ENABLE(queryword, whether to enable queryword support,
Make sure that the comment is aligned:
[ –enable-queryword Enable queryword support])
if test “$PHP_QUERYWORD” != “no”; then
PHP_ADD_INCLUDE(./lib)
PHP_ADD_LIBRARY(stdc++, 1, QUERYWORD_SHARED_LIBADD)
PHP_ADD_LIBRARY_WITH_PATH(queryword, ./lib, QUERYWORD_SHARED_LIBADD)
PHP_REQUIRE_CXX()
PHP_SUBST(QUERYWORD_SHARED_LIBADD)
PHP_NEW_EXTENSION(queryword, queryword.cpp, $ext_shared)
fi
其中:
PHP_REQUIRE_CXX()用於指定這個擴展用到了C++
PHP_ADD_LIBRARY(stdc++, 1, QUERYWORD_SHARED_LIBADD) 用於將標準C++庫鏈接進入擴展
PHP_NEW_EXTENSION用於指定有哪些源文件應該被編譯,文件和文件之間用空格隔開.ext_skel默認生成的模塊框架是針對C的,我們要使用C++,那以上說明的兩個宏就是必須的.另外還要把queryword.c改名成queryword.cpp,所以PHP_NEW_EXTENSION原本包括的queryword.c也要修改.
默認生成的queryword.c(現在改名為queryword.cpp)了,已經包含了一個測試性質的導出函數,通過那個例子就可以大概明白怎麼添加自己的函數了. zend_function_entry是導出函數列表, zend_module_entry描述了模塊的信息. 不過因為是C++了,還是有幾點要修改的,否則跑不起來:
php中怎麼調用方法中的靜態變量?
static
變量是php中的變量作用範圍的一個重要特性
靜態變量僅在局部函數域中存在且只被初始化一次,當程序執行離開此作用域時,其值不會消失,會使用上次執行的結果
一個普通的變量,如
$message
在它所在的函數執行完之後就被釋放了
即第二個function執行10次,每次執行完後,$message變量被釋放,所以每次都是1
變量前加了static後,該變量在它所在的函數執行完後不會被釋放
即第一個function每次被執行後,static
$message沒有被釋放,它將被繼續累加
PHP兩個次調用靜態變量的疑問
是否為先請求A.php然後再請求B.php,這樣的話在B頁面會一直是空值
應該在一次請求中先set再get,這樣得到的值就是設置後後的新值
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/200540.html