因为PHP的底层就是C开发的,不可避免的经常使用PHP扩展也都是C开发的,可是有时咱们想用C++来开发能够吗,答案固然是能够的,而且有它本身的优点,第一能够方便地面向对象编程,第二能够利用现有C++编译的动态连接库。php
常规的PHP扩展开发流程我再别的文章里面已经介绍过了,这里再也不赘述,只介绍一下C++开发PHP扩展的不一样之处。c++
利用ext_skel工具生成扩展的基础框架,默认生成的框架是针对C的,因此针对C++修改config.m4文件
config.m4文件是编译基础中最核心的文件,这个文件主要是用autoconf来产生configure配置文件,继而自动生成你们所熟悉的Makefile文件。须要注意的是,每次修改config.m4,须要phpize --clean,再从新phpize编程
PHP_ARG_WITH(dict, for hsdt support, Make sure that the comment is aligned: [ --with-demo Include demo support])
表示demo扩展须要依赖外部动态连接库,在configure的时候 --with-demo的参数表示依赖外部动态连接库的路径,好比编译PHP时使用的--with-curl=/usr/local/libcurl表示依赖的libcurl.so的路径在/usr/local/libcurl里面框架
PHP_ADD_INCLUDE($DEMO_DIR/include)
表示依赖的外部动态连接库的include的头文件的路径curl
PHP_REQUIRE_CXX()
表示这个扩展使用C++工具
PHP_SUBST(DEMO_SHARED_LIBADD)
用于说明这个扩展编译成动态连接库的形式url
PHP_ADD_LIBRARY(stdc++, 1, DEMO_SHARED_LIBADD)
用于将标准C++库加入扩展code
PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $DICT_DIR/lib64, DICT_SHARED_LIBADD)
用于将依赖的外部动态连接库加入扩展对象
PHP_NEW_EXTENSION(demo, xxx.cpp yyy.cpp zzz.cpp, $ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)
第2行指定哪些源文件须要编译,中间用空格间隔开发
包括.h文件和.cpp文件,由于PHP提供的ZEND API都是C编写的,因此在include的时候须要在外面加一层extern "C",目的是把一些C写的库或宏用兼容的方式给解决。剩下的代码本身用C++自由发挥吧。
extern "C" { #ifdef ZTS #include "TSRM.h" #endif }
extern "C" { #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" }