用C++開發PHP擴展

因爲PHP的底層就是C開發的,不可避免的經常使用PHP擴展也都是C開發的,可是有時咱們想用C++來開發能夠嗎,答案固然是能夠的,而且有它本身的優點,第一能夠方便地面向對象編程,第二能夠利用現有C++編譯的動態連接庫。php

常規的PHP擴展開發流程我再別的文章裏面已經介紹過了,這裏再也不贅述,只介紹一下C++開發PHP擴展的不一樣之處。c++

修改config.m4

利用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"
}
相關文章
相關標籤/搜索