摘要:下載命令行瀏覽器下載網址和倉庫網址一樣一不帶參數,沒有返回值的擴展函數寫法函數功能打印以內的素數函數名稱如何注冊擴展函數必須在函數體中,注冊函數,以便能在中能直接調用。函數有返回值,返回值類型設置為。
</>復制代碼
PHP擴展是高級PHP程序員必須了解的技能之一,對于一個初入門的PHP擴展開發者,怎么才能開發一個成熟的擴展,進入PHP開發的高級領域呢?本系列開發教程將手把手帶您從入門進入高級階段。
本教程系列在linux下面開發(推薦使用centos),php版本用的是5.6,并假設您有一定的linux操作經驗和c/c++基礎。
有問題需要溝通的朋友請加QQ技術交流群32550793和我溝通。
上一章演示了一個hello world擴展,大家基本了解了用PHP-CPP開發的擴展的C++源碼的基本樣式。下面一起開發一個簡單的數學運算庫(mymath)來熟悉如何導出各種接口函數。
mymath數學庫的代碼已放在github上,可以直接git下載或者瀏覽器打開網頁下載源碼。
git下載命令行
</>復制代碼
git clone https://github.com/elvisszhang/phpcpp_mymath.git
瀏覽器下載網址和倉庫網址一樣:https://github.com/elvisszhan...
一、不帶參數,沒有返回值的擴展函數寫法函數功能:打印100以內的素數
函數名稱:mm_print_pn_100
</>復制代碼
如何注冊擴展函數
必須在get_module函數體中,注冊函數 mm_print_pn_100,以便能在php中能直接調用。
</>復制代碼
PHPCPP_EXPORT void *get_module()
{
// 必須是static類型,因為擴展對象需要在PHP進程內常駐內存
static Php::Extension extension("mymath", "1.0.0");
//這里可以添加你要暴露給PHP調用的函數
extension.add("mm_print_pn_100");
// 返回擴展對象指針
return extension;
}
函數聲明及代碼如下。
函數不需要參數,函數的參數列表里面什么也不用放,空著就行。函數不需要返回值,返回值類型設置為void。
</>復制代碼
//打印100以內的素數
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; //取余數
if (a == 0) { //如果x被z整除
if (z == 1) {//如果z為1(x是質數)
Php::out << x << " ";//輸出x
line ++;//每行輸出的數的數量加1
}
x ++; //x加1
y = 1;//y還原
}
else {//如果沒有被整除
y ++;//y加1,下一次循環中z減1
}
if (line == 10) {//每輸出10個數
Php::out << std::endl;//輸出一個換行
line = 0;//還原line
}
}
if (line != 0) //最后一行輸出換行
Php::out << std::endl;
Php::out.flush();
}
PHP測試代碼
</>復制代碼
運行以上PHP代碼,輸出結果是
</>復制代碼
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
二、不帶參數,有返回值的擴展函數寫法
函數功能:計算1、2、3、...、100的和
函數名稱:mm_sum_1_100
注冊函數 mm_sum_1_100,注冊方式同上一節
</>復制代碼
extension.add("mm_sum_1_100");
函數聲明及代碼如下。
函數不需要參數,函數參數列表設置為空就可以。
函數有返回值,返回值類型設置為 Php::Value。由于Php::value 重載了構造函數和operator = 運算符,常見數據類型(整形,字符串,浮點數,數組等)可以直接返回。
</>復制代碼
//獲取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代碼,輸出結果是
</>復制代碼
sum (1~100) = 5050
三、帶有參數,沒有返回值的擴展函數寫法
函數功能:計算任意給定整數,打印該整數以內的所有素數
函數名稱:mm_print_pn_any
注冊函數 mm_print_pn_any,注冊方式同上一節
</>復制代碼
extension.add("mm_print_pn_any");
函數聲明及代碼如下。由于需要參數,函數參數需要寫成Php::Parameters ¶ms,由于沒有返回值,返回值類型設置void。
另外需要檢測參數是否輸入,參數的類型也需要檢測是不是整形。不檢測直接用的話,代碼容易出異常。
</>復制代碼
//任意給定一個整數,打印出小于等于該整數的所有素數
void mm_print_pn_any(Php::Parameters ¶ms)
{
//檢查必須輸入一個參數
if(params.size() == 0){
Php::out << "error: need a parameter " << std::endl;
return;
}
//檢查參數必須是整形
if( params[0].type() != Php::Type::Numeric){
Php::out << "error: parameter must be numeric" << std::endl;
return;
}
//檢查數字必須大于1
int number = params[0];
if(number <= 1){
Php::out << "error: parameter must be larger than 1" << std::endl;
return;
}
//檢查參數必須大于0
int x = 2;
int y = 1;
int line = 0;
while (x <= number){
int z = x - y; //z隨y遞減1
int a = x%z; //取余數
if (a == 0) { //如果x被z整除
if (z == 1) {//如果z為1(x是質數)
Php::out << x << " ";//輸出x
line ++;//每行輸出的數的數量加1
}
x ++; //x加1
y = 1;//y還原
}
else {//如果沒有被整除
y ++;//y加1,下一次循環中z減1
}
if (line == 10) {//每輸出10個數
Php::out << std::endl;//輸出一個換行
line = 0;//還原line
}
}
if (line != 0) //最后一行輸出換行
Php::out << std::endl;
Php::out.flush();
}
PHP測試代碼
</>復制代碼
運行以上PHP代碼,輸出結果是
</>復制代碼
---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
四、標量型參數,有返回值的擴展函數寫法
函數功能:給定一系列參數,計算其總和
函數名稱:mm_sum_all
注冊擴展函數 mm_sum_all,注冊方式同上一節
</>復制代碼
extension.add("mm_sum_all");
函數聲明及代碼如下。
</>復制代碼
//獲取所有參數的和
Php::Value mm_sum_all(Php::Parameters ¶ms)
{
int sum = 0;
for (auto ¶m : params){
//字符串類型可以自動轉換成整形
sum += param;
}
return sum;
}
PHP測試代碼
</>復制代碼
測試輸出結果:
</>復制代碼
sum (1,2,"3","5") = 11
五、數組型參數,有返回值的擴展函數寫法
函數功能:給定一個數組類型的參數,計算數組全部元素的總和
函數名稱:mm_sum_array
注冊函數 mm_sum_array ,注冊方式同第一節
函數聲明及代碼如下。
</>復制代碼
//獲取所有數組各元素的和
Php::Value mm_sum_array(Php::Parameters ¶ms)
{
//沒有給定參數,返回0
if(params.size() == 0){
return 0;
}
//參數類型不是數組,轉成整形返回
if( params[0].type() != Php::Type::Array){
return (int)params[0];
}
//數組中的元素逐個相加
int sum = 0;
Php::Value array = params[0];
int size = array.size();
int i;
for(i=0;i
PHP測試代碼
</>復制代碼
測試輸出結果:
</>復制代碼
sum (array(1,3,5,7)) = 16
六、返回值類型是數組的擴展函數寫法
上面函數的返回值都是標量類型,數組是PHP特別常用的類型,如果想返回一個數組類型,可以使用c++的std::vector,PHP-CPP會貼心的把它自動轉換成PHP認識的數組類型。
我們現在的演示函數功能是“返回30以內的所有素數的數組”。擴展里面注冊函數的方式同第一節。
函數聲明及代碼如下。
</>復制代碼
//獲取30以內的所有素數
Php::Value mm_get_pn_30()
{
std::vector pn;
int x = 2;
int y = 1;
while (x <= 30){
int z = x - y; //z隨y遞減1
int a = x%z; //取余數
if (a == 0) { //如果x被z整除
if (z == 1) {//如果z為1(x是質數)
pn.push_back(x); //放數組中去
}
x ++; //x加1
y = 1;//y還原
}
else {//如果沒有被整除
y ++;//y加1,下一次循環中z減1
}
}
return pn;
}
PHP測試代碼
</>復制代碼
測試輸出結果:
</>復制代碼
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)
}
七、參考文獻
c++質數判定及輸出質數表
PHP-CPP函數開發幫助
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/28578.html
摘要:編程書籍的整理和收集最近一直在學習深度學習和機器學習的東西,發現深入地去學習就需要不斷的去提高自己算法和高數的能力然后也找了很多的書和文章,隨著不斷的學習,也整理了下自己的學習筆記準備分享出來給大家后續的文章和總結會繼續分享,先分享一部分的 編程書籍的整理和收集 最近一直在學習deep learning深度學習和機器學習的東西,發現深入地去學習就需要不斷的去提高自己算法和高數的能力然后...
摘要:入門,第一個這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數式編程語言,它的代碼運行在之上。它通過編輯類工具,帶來了先進的編輯體驗,增強了語言服務。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經到來了,總結過去的 2017,相信小伙們一定有很多收獲...
閱讀 1323·2021-11-15 11:37
閱讀 2580·2021-09-22 10:56
閱讀 3403·2021-09-06 15:11
閱讀 814·2021-08-31 09:45
閱讀 2914·2021-07-28 11:16
閱讀 1816·2019-08-30 15:44
閱讀 487·2019-08-30 13:22
閱讀 3354·2019-08-30 13:18
极致性价比!云服务器续费无忧!
Tesla A100/A800、Tesla V100S等多种GPU云主机特惠2折起,不限台数,续费同价。
NVIDIA RTX 40系,高性价比推理显卡,满足AI应用场景需要。
乌兰察布+上海青浦,满足东推西训AI场景需要