本文目录一览:
如何在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,这样得到的值就是设置后后的新值