摘要:下載命令行瀏覽器下載網(wǎng)址和倉庫網(wǎng)址一樣一不帶參數(shù),沒有返回值的擴(kuò)展函數(shù)寫法函數(shù)功能打印以內(nèi)的素數(shù)函數(shù)名稱如何注冊擴(kuò)展函數(shù)必須在函數(shù)體中,注冊函數(shù),以便能在中能直接調(diào)用。函數(shù)有返回值,返回值類型設(shè)置為。
PHP擴(kuò)展是高級PHP程序員必須了解的技能之一,對于一個初入門的PHP擴(kuò)展開發(fā)者,怎么才能開發(fā)一個成熟的擴(kuò)展,進(jìn)入PHP開發(fā)的高級領(lǐng)域呢?本系列開發(fā)教程將手把手帶您從入門進(jìn)入高級階段。
本教程系列在linux下面開發(fā)(推薦使用centos),php版本用的是5.6,并假設(shè)您有一定的linux操作經(jīng)驗和c/c++基礎(chǔ)。
有問題需要溝通的朋友請加QQ技術(shù)交流群32550793和我溝通。
上一章演示了一個hello world擴(kuò)展,大家基本了解了用PHP-CPP開發(fā)的擴(kuò)展的C++源碼的基本樣式。下面一起開發(fā)一個簡單的數(shù)學(xué)運算庫(mymath)來熟悉如何導(dǎo)出各種接口函數(shù)。
mymath數(shù)學(xué)庫的代碼已放在github上,可以直接git下載或者瀏覽器打開網(wǎng)頁下載源碼。
git下載命令行
git clone https://github.com/elvisszhang/phpcpp_mymath.git
瀏覽器下載網(wǎng)址和倉庫網(wǎng)址一樣:https://github.com/elvisszhan...
一、不帶參數(shù),沒有返回值的擴(kuò)展函數(shù)寫法函數(shù)功能:打印100以內(nèi)的素數(shù)
函數(shù)名稱:mm_print_pn_100
如何注冊擴(kuò)展函數(shù)
必須在get_module函數(shù)體中,注冊函數(shù) mm_print_pn_100,以便能在php中能直接調(diào)用。
PHPCPP_EXPORT void *get_module() { // 必須是static類型,因為擴(kuò)展對象需要在PHP進(jìn)程內(nèi)常駐內(nèi)存 static Php::Extension extension("mymath", "1.0.0"); //這里可以添加你要暴露給PHP調(diào)用的函數(shù) extension.add("mm_print_pn_100"); // 返回擴(kuò)展對象指針 return extension; }
函數(shù)聲明及代碼如下。
函數(shù)不需要參數(shù),函數(shù)的參數(shù)列表里面什么也不用放,空著就行。函數(shù)不需要返回值,返回值類型設(shè)置為void。
//打印100以內(nèi)的素數(shù) void mm_print_pn_100() { int x = 2; int y = 1; int line = 0; while (x <= 100){ int z = x - y; //z隨y遞減1 int a = x%z; //取余數(shù) if (a == 0) { //如果x被z整除 if (z == 1) {//如果z為1(x是質(zhì)數(shù)) Php::out << x << " ";//輸出x line ++;//每行輸出的數(shù)的數(shù)量加1 } x ++; //x加1 y = 1;//y還原 } else {//如果沒有被整除 y ++;//y加1,下一次循環(huán)中z減1 } if (line == 10) {//每輸出10個數(shù) Php::out << std::endl;//輸出一個換行 line = 0;//還原line } } if (line != 0) //最后一行輸出換行 Php::out << std::endl; Php::out.flush(); }
PHP測試代碼
運行以上PHP代碼,輸出結(jié)果是
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97二、不帶參數(shù),有返回值的擴(kuò)展函數(shù)寫法函數(shù)功能:計算1、2、3、...、100的和
函數(shù)名稱:mm_sum_1_100注冊函數(shù) mm_sum_1_100,注冊方式同上一節(jié)
extension.add("mm_sum_1_100"); 函數(shù)聲明及代碼如下。
函數(shù)不需要參數(shù),函數(shù)參數(shù)列表設(shè)置為空就可以。
函數(shù)有返回值,返回值類型設(shè)置為 Php::Value。由于Php::value 重載了構(gòu)造函數(shù)和operator = 運算符,常見數(shù)據(jù)類型(整形,字符串,浮點數(shù),數(shù)組等)可以直接返回。//獲取1-100的和 Php::Value mm_sum_1_100() { int sum = 0; int i; for(i=1;i<=100;i++){ sum += i; } return sum; //可以直接返回sum值,自動生成 Php::value 類型 }PHP測試代碼:
運行以上PHP代碼,輸出結(jié)果是
sum (1~100) = 5050三、帶有參數(shù),沒有返回值的擴(kuò)展函數(shù)寫法函數(shù)功能:計算任意給定整數(shù),打印該整數(shù)以內(nèi)的所有素數(shù)
函數(shù)名稱:mm_print_pn_any
注冊函數(shù) mm_print_pn_any,注冊方式同上一節(jié)
extension.add("mm_print_pn_any"); 函數(shù)聲明及代碼如下。由于需要參數(shù),函數(shù)參數(shù)需要寫成Php::Parameters ¶ms,由于沒有返回值,返回值類型設(shè)置void。
另外需要檢測參數(shù)是否輸入,參數(shù)的類型也需要檢測是不是整形。不檢測直接用的話,代碼容易出異常。//任意給定一個整數(shù),打印出小于等于該整數(shù)的所有素數(shù) void mm_print_pn_any(Php::Parameters ¶ms) { //檢查必須輸入一個參數(shù) if(params.size() == 0){ Php::out << "error: need a parameter " << std::endl; return; } //檢查參數(shù)必須是整形 if( params[0].type() != Php::Type::Numeric){ Php::out << "error: parameter must be numeric" << std::endl; return; } //檢查數(shù)字必須大于1 int number = params[0]; if(number <= 1){ Php::out << "error: parameter must be larger than 1" << std::endl; return; } //檢查參數(shù)必須大于0 int x = 2; int y = 1; int line = 0; while (x <= number){ int z = x - y; //z隨y遞減1 int a = x%z; //取余數(shù) if (a == 0) { //如果x被z整除 if (z == 1) {//如果z為1(x是質(zhì)數(shù)) Php::out << x << " ";//輸出x line ++;//每行輸出的數(shù)的數(shù)量加1 } x ++; //x加1 y = 1;//y還原 } else {//如果沒有被整除 y ++;//y加1,下一次循環(huán)中z減1 } if (line == 10) {//每輸出10個數(shù) Php::out << std::endl;//輸出一個換行 line = 0;//還原line } } if (line != 0) //最后一行輸出換行 Php::out << std::endl; Php::out.flush(); }PHP測試代碼
運行以上PHP代碼,輸出結(jié)果是
---runing mm_print_pn_any()--- error: need a parameter ---runing mm_print_pn_any("xyz")--- error: parameter must be numeric ---runing mm_print_pn_any(200)--- 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199四、標(biāo)量型參數(shù),有返回值的擴(kuò)展函數(shù)寫法函數(shù)功能:給定一系列參數(shù),計算其總和
函數(shù)名稱:mm_sum_all
注冊擴(kuò)展函數(shù) mm_sum_all,注冊方式同上一節(jié)
extension.add("mm_sum_all"); 函數(shù)聲明及代碼如下。
//獲取所有參數(shù)的和 Php::Value mm_sum_all(Php::Parameters ¶ms) { int sum = 0; for (auto ¶m : params){ //字符串類型可以自動轉(zhuǎn)換成整形 sum += param; } return sum; }PHP測試代碼
測試輸出結(jié)果:
sum (1,2,"3","5") = 11五、數(shù)組型參數(shù),有返回值的擴(kuò)展函數(shù)寫法函數(shù)功能:給定一個數(shù)組類型的參數(shù),計算數(shù)組全部元素的總和
函數(shù)名稱:mm_sum_array
注冊函數(shù) mm_sum_array ,注冊方式同第一節(jié)
函數(shù)聲明及代碼如下。
//獲取所有數(shù)組各元素的和 Php::Value mm_sum_array(Php::Parameters ¶ms) { //沒有給定參數(shù),返回0 if(params.size() == 0){ return 0; } //參數(shù)類型不是數(shù)組,轉(zhuǎn)成整形返回 if( params[0].type() != Php::Type::Array){ return (int)params[0]; } //數(shù)組中的元素逐個相加 int sum = 0; Php::Value array = params[0]; int size = array.size(); int i; for(i=0;iPHP測試代碼
測試輸出結(jié)果:
sum (array(1,3,5,7)) = 16六、返回值類型是數(shù)組的擴(kuò)展函數(shù)寫法上面函數(shù)的返回值都是標(biāo)量類型,數(shù)組是PHP特別常用的類型,如果想返回一個數(shù)組類型,可以使用c++的std::vector,PHP-CPP會貼心的把它自動轉(zhuǎn)換成PHP認(rèn)識的數(shù)組類型。
我們現(xiàn)在的演示函數(shù)功能是“返回30以內(nèi)的所有素數(shù)的數(shù)組”。擴(kuò)展里面注冊函數(shù)的方式同第一節(jié)。
函數(shù)聲明及代碼如下。
//獲取30以內(nèi)的所有素數(shù) Php::Value mm_get_pn_30() { std::vectorpn; int x = 2; int y = 1; while (x <= 30){ int z = x - y; //z隨y遞減1 int a = x%z; //取余數(shù) if (a == 0) { //如果x被z整除 if (z == 1) {//如果z為1(x是質(zhì)數(shù)) pn.push_back(x); //放數(shù)組中去 } x ++; //x加1 y = 1;//y還原 } else {//如果沒有被整除 y ++;//y加1,下一次循環(huán)中z減1 } } return pn; } PHP測試代碼
測試輸出結(jié)果:
array(10) { [0]=> int(2) [1]=> int(3) [2]=> int(5) [3]=> int(7) [4]=> int(11) [5]=> int(13) [6]=> int(17) [7]=> int(19) [8]=> int(23) [9]=> int(29) }七、參考文獻(xiàn)c++質(zhì)數(shù)判定及輸出質(zhì)數(shù)表
PHP-CPP函數(shù)開發(fā)幫助
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/28578.html
摘要:編程書籍的整理和收集最近一直在學(xué)習(xí)深度學(xué)習(xí)和機(jī)器學(xué)習(xí)的東西,發(fā)現(xiàn)深入地去學(xué)習(xí)就需要不斷的去提高自己算法和高數(shù)的能力然后也找了很多的書和文章,隨著不斷的學(xué)習(xí),也整理了下自己的學(xué)習(xí)筆記準(zhǔn)備分享出來給大家后續(xù)的文章和總結(jié)會繼續(xù)分享,先分享一部分的 編程書籍的整理和收集 最近一直在學(xué)習(xí)deep learning深度學(xué)習(xí)和機(jī)器學(xué)習(xí)的東西,發(fā)現(xiàn)深入地去學(xué)習(xí)就需要不斷的去提高自己算法和高數(shù)的能力然后...
摘要:入門,第一個這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數(shù)式編程語言,它的代碼運行在之上。它通過編輯類工具,帶來了先進(jìn)的編輯體驗,增強(qiáng)了語言服務(wù)。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經(jīng)到來了,總結(jié)過去的 2017,相信小伙們一定有很多收獲...
閱讀 1324·2021-11-15 11:37
閱讀 2582·2021-09-22 10:56
閱讀 3405·2021-09-06 15:11
閱讀 817·2021-08-31 09:45
閱讀 2914·2021-07-28 11:16
閱讀 1819·2019-08-30 15:44
閱讀 488·2019-08-30 13:22
閱讀 3358·2019-08-30 13:18