因爲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" }