摘要:四使用語言開發(fā)是我重點推薦的擴展開發(fā)框架,簡明易懂,功能強大,開發(fā)效率高,代碼易維護,執(zhí)行速度快。優(yōu)點三支持,的擴展開發(fā)有兩套擴展開發(fā)框架,分別支持,,雖然框架代碼有兩個,但是接口卻是一樣的。
PHP擴展是高級PHP程序員必須了解的技能之一,對于一個初入門的PHP擴展開發(fā)者,怎么才能開發(fā)一個成熟的擴展,進入PHP開發(fā)的高級領(lǐng)域呢?本系列開發(fā)教程將手把手帶您從入門進入高級階段。
本教程系列在linux下面開發(fā)(推薦使用centos),php版本用的是5.6,并假設(shè)您有一定的linux操作經(jīng)驗和c/c++基礎(chǔ)。
有問題需要溝通的朋友請加QQ技術(shù)交流群32550793和我溝通。
開發(fā)php擴展有好幾種技術(shù)方法和框架,對于初學(xué)者來說,最好能夠選擇一個最容易下手,最快出效果的框架,這樣才能提升學(xué)習(xí)的興趣。下面逐一對比一下各個技術(shù)框架,讓大家能夠找到最適合自己的。
一、使用ext-skel C語言開發(fā)ext-skel是PHP官方源碼里提供的生成php擴展的工具,可以生成一個c語言框架的php擴展的骨架。
PHP 官方對擴展開發(fā)者非常不友好,源代碼中提供的Zend API極其難用,API復(fù)雜而且凌亂,充斥著各種宏的寫法。Zend API坑非常多,普通開發(fā)者很容易踩到坑里。出現(xiàn)各種莫名其妙的core dump問題。Zend API幾乎沒有任何文檔,開發(fā)者如果要真正掌握這項技能需要付出大量的學(xué)習(xí)時間。
以上是swoole插件開發(fā)者的肺腑之言,可見用這個方法來開發(fā)插件,對我們初學(xué)者來說將是對自信心極嚴重的打擊。幸好有大神們?yōu)槲覀儨蕚淞似渌_發(fā)php擴展的方法,不用學(xué)習(xí)zend api,不用精通c語言,也照樣能開發(fā)php擴展,而且生成的擴展運行速度不會比c語言開發(fā)的相差太多。
二、使用zephir 類php語言開發(fā)Zephir提供了一種類似php的高級語言語法的方式,來自動生成擴展的c語言代碼,使編寫php擴展變得非常的簡單。不過這種開發(fā)方式帶來了一個問題,就是由于他用的不是c/c++語言開發(fā),那就沒辦法直接利用現(xiàn)有的各種c/c++開發(fā)庫來實現(xiàn)強大的功能。所以感覺上有點雞肋。
三、使用PHP-X C++語言開發(fā)php-x是知名的swoole擴展開發(fā)者根據(jù)多年的開發(fā)經(jīng)驗,提煉出來的一套基于c++的擴展開發(fā)框架。從文檔來看,這是一個比較容易上手的開發(fā)框架,數(shù)據(jù)類型很齊全,和php cpp的開發(fā)風(fēng)格非常相似,但本人還沒有去體驗使用。
按照php-x官方的文檔,開發(fā)出來的擴展只支持PHP7以上,這是一個遺憾。
PHP CPP是我重點推薦的php擴展開發(fā)框架,簡明易懂,功能強大,開發(fā)效率高,代碼易維護,執(zhí)行速度快。
PHP CPP是一款免費的php開發(fā)擴展庫,主要針對C++語言,可以進行類集合的擴展和構(gòu)建,采用簡單的計算機語言,讓擴展變得更有趣更有用,方便開發(fā)者進行維護和編寫,易于理解、維護輕松并且代碼優(yōu)美。用C ++編寫的算法看起來與用PHP編寫的算法幾乎完全相同。如果你知道如何在PHP中編程,你可以很容易地學(xué)習(xí)如何在C ++中做同樣的。
優(yōu)點一:不需要Zend引擎知識。
Zend引擎的內(nèi)部太復(fù)雜,Zend引擎的代碼是一團糟,并且大多是無證的。但是PHP-CPP庫已經(jīng)在非常容易使用的C ++類和對象中封裝了所有這些復(fù)雜的結(jié)構(gòu)。你可以使用C ++寫出驚人的快速算法,而不必直接調(diào)用Zend引擎,甚至無需查看Zend引擎源代碼。使用PHP-CPP,您可以編寫本地代碼,而無需處理PHP的內(nèi)部。
優(yōu)點二:支持所有重要的PHP功能
使用PHP-CPP,您可以像使用普通PHP腳本一樣輕松地處理變量,數(shù)組,函數(shù),對象,類,接口,異常和命名空間。除此之外,你可以使用C ++的所有功能,包括線程,lambda和異步編程。
優(yōu)點三:支持PHP 5.X,PHP7的擴展開發(fā)
PHP-CPP有兩套擴展開發(fā)框架,分別支持PHP 5.X,PHP7,雖然框架代碼有兩個,但是接口卻是一樣的。所以如果你要開發(fā)兼容多個版本的php擴展,不會花費你額外太多時間做兼容。
五、各開發(fā)框架的 hello world 擴展源碼大比拼下面列出各個框架的hello world擴展源碼,從源碼長度和復(fù)雜度,就能有個直觀感受。
ext-skel生成的c擴展源碼明顯可讀性極差,也極難理解。
zephir的擴展源碼最類似php語法,最容易入手,但難以加入成熟的c/c++庫代碼。
PHP-X和PHP CPP的源碼風(fēng)格很相似,都是標準的c++語言,都很容易看懂。不難想象,這兩種方式開發(fā)擴展必然是最合適的,因為我們既能利用c++的封裝簡化開發(fā),又能直接調(diào)用市面上各個成熟c++庫為我們服務(wù)。
ext-skel的hello world源碼
#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" #include "php_helloworld.h" static int le_helloworld; PHP_FUNCTION(confirm_helloworld_compiled) { char *arg = NULL; int arg_len, len; char *strg; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) { return; } len = spprintf(&strg, 0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "helloworld", arg); RETURN_STRINGL(strg, len, 0); } PHP_MINIT_FUNCTION(helloworld) { return SUCCESS; } PHP_MSHUTDOWN_FUNCTION(helloworld) { return SUCCESS; } PHP_RINIT_FUNCTION(helloworld) { return SUCCESS; } PHP_RSHUTDOWN_FUNCTION(helloworld) { return SUCCESS; } PHP_MINFO_FUNCTION(helloworld) { php_info_print_table_start(); php_info_print_table_header(2, "helloworld support", "enabled"); php_info_print_table_end(); } const zend_function_entry helloworld_functions[] = { PHP_FE(confirm_helloworld_compiled, NULL) /* For testing, remove later. */ PHP_FE_END /* Must be the last line in helloworld_functions[] */ }; zend_module_entry helloworld_module_entry = { STANDARD_MODULE_HEADER, "helloworld", helloworld_functions, PHP_MINIT(helloworld), PHP_MSHUTDOWN(helloworld), PHP_RINIT(helloworld), /* Replace with NULL if there"s nothing to do at request start */ PHP_RSHUTDOWN(helloworld), /* Replace with NULL if there"s nothing to do at request end */ PHP_MINFO(helloworld), PHP_HELLOWORLD_VERSION, STANDARD_MODULE_PROPERTIES }; #ifdef COMPILE_DL_HELLOWORLD ZEND_GET_MODULE(helloworld) #endif
zephir的hello world源碼
namespace Test; class Hello { public function say() { echo "Hello World!"; } }
PHP-X的hello world源碼
#includeusing namespace std; using namespace php; //聲明函數(shù) PHPX_FUNCTION(say_hello); //導(dǎo)出模塊 PHPX_EXTENSION() { Extension *ext = new Extension("hello-world", "0.0.1"); ext->registerFunction(PHPX_FN(say_hello)); return ext; } //實現(xiàn)函數(shù) PHPX_FUNCTION(say_hello) { echo("hello world"); }
PHP CPP的hello world源碼
#include參考文獻void say_hello(Php::Parameters ¶ms) { Php::out << "hello world" << std::endl; } extern "C" { PHPCPP_EXPORT void *get_module() { static Php::Extension extension("helloworld", "1.0"); extension.add("say_hello", say_hello); return extension; } }
如何基于 PHP-X 快速開發(fā)一個 PHP 擴展
PHP-X中文幫助
5分鐘PHP擴展開發(fā)快速入門
zephir中文網(wǎng)
zephir英文官網(wǎng)
zephir安裝和演示開發(fā)
phpcpp英文官網(wǎng)
phpcpp英文幫助
phpcpp中文幫助
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/28529.html
摘要:最新最全的開源項目合集掘金是由整理并維護的安卓相關(guān)開源項目庫集合。準備的插件開發(fā)必開發(fā)者福利史上最全開發(fā)和安全系列工具掘金取證工具一個工具箱,用于分析手機元數(shù)據(jù)。 最新最全的 Android 開源項目合集 - Android - 掘金awesome-github-android-ui 是由OpenDigg整理并維護的安卓UI相關(guān)開源項目庫集合。我們會定期同步OpenDigg上的項目到這...
摘要:入門,第一個這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數(shù)式編程語言,它的代碼運行在之上。它通過編輯類工具,帶來了先進的編輯體驗,增強了語言服務(wù)。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經(jīng)到來了,總結(jié)過去的 2017,相信小伙們一定有很多收獲...
摘要:入門,第一個這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數(shù)式編程語言,它的代碼運行在之上。它通過編輯類工具,帶來了先進的編輯體驗,增強了語言服務(wù)。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經(jīng)到來了,總結(jié)過去的 2017,相信小伙們一定有很多收獲...
摘要:入門,第一個這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數(shù)式編程語言,它的代碼運行在之上。它通過編輯類工具,帶來了先進的編輯體驗,增強了語言服務(wù)。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經(jīng)到來了,總結(jié)過去的 2017,相信小伙們一定有很多收獲...
摘要:最適合入門的初級教程一為什么選擇曾經(jīng)要跟白頭到老沒想到它升了個級就拋了錨把我等拋棄了痛定思痛重新審視了一遍框架是世界上最好的語言這個沒有疑問吧如果有那絕對是個異教徒這是要被拖出去燒死的信仰的問題神圣不可侵犯那最好的語言中最流行的框架是哪個呢 最適合入門的 Laravel 初級教程 (一) 為什么選擇 laravel 曾經(jīng)要跟 thinkphp 白頭到老;沒想到它升了個級就拋了錨;把我等...
閱讀 3960·2021-11-24 09:38
閱讀 1225·2021-10-19 11:42
閱讀 1829·2021-10-14 09:42
閱讀 2154·2019-08-30 15:44
閱讀 544·2019-08-30 14:04
閱讀 2888·2019-08-30 13:13
閱讀 1949·2019-08-30 12:51
閱讀 955·2019-08-30 11:22