当前位置: 首页 > 后端技术 > PHP

PHP扩展开发教程3——开发自己的数学函数库

时间:2023-03-29 14:20:13 PHP

PHP扩展是高级PHP程序员必须掌握的技能之一。对于初学者PHP扩展开发者,如何开发成熟的扩展,进入PHP开发的高级领域呢?本系列开发教程将带您从初级到高级。本教程系列在linux下开发(推荐centos),php版本使用5.6,假设你有一定的linux操作经验和c/c++基础。如果大家有什么问题需要交流,欢迎加入QQ技术交流群32550793与我交流。上一章演示了一个helloworld扩展,大家对使用PHP-CPP开发的扩展的C++源码的基本风格有了基本的了解。下面我们一起开发一个简单的数学运算库(mymath),熟悉如何导出各种接口函数。mymath数学库的代码已经放在了github上,可以直接从git上下载或者用浏览器打开网页下载源码。git下载命令行gitclonehttps://github.com/elvisszhang/phpcpp_mymath.git浏览器下载地址同仓库地址:https://github.com/elvisszhan...1.无参数,不返回value扩展函数的写法函数功能:打印100以内的质数函数名:mm_print_pn_100扩展函数的注册方法必须在get_module函数体中,注册函数mm_print_pn_100,这样在php中就可以直接调用了。PHPCPP_EXPORTvoid*get_module(){//必须是静态类型,因为扩展对象需要在PHP进程中驻留在内存中staticPhp::Extensionextension("mymath","1.0.0");//这里可以添加你想要的暴露给PHP扩展调用的函数.add("mm_print_pn_100");//返回扩展对象指针returnextension;}函数声明及代码如下。函数不需要参数,函数的参数列表中也不需要放任何东西,留空即可。该函数不需要返回值,返回值类型设置为void。//打印100以内的素数voidmm_print_pn_100(){intx=2;整数y=1;内线=0;while(x<=100){intz=x-y;//z随y减1inta=x%z;//取余if(a==0){//如果x可以被z整除if(z==1){//如果z是1(x是质数)Php::out<("mm_sum_1_100");函数声明及代码如下。函数不需要参数,函数参数列表可以设置为空。函数有返回值,返回值类型设置为Php::Value。由于Php::value重载了构造函数和operator=运算符,可以直接返回常见的数据类型(整型、字符串、浮点型、数组等)。//获取1-100的总和Php::Valuemm_sum_1_100(){intsum=0;诠释我;for(i=1;i<=100;i++){sum+=i;}返回总和;//OK直接返回sum值,自动生成Php::value类型}PHP测试代码:运行上面的PHP代码,输出结果为sum(1~100)=50503.扩展函数写法,带参数无返回值函数功能:计算任意给定的整数,并打印整数内的所有素数Function名称:mm_print_pn_any注册函数mm_print_pn_any,注册方法同上一节extension.add("mm_print_pn_any");函数声明和代码如下。由于需要参数,函数参数需要写成Php::Parameters¶ms,由于没有返回值,所以返回值类型设置为void。另外需要检测参数是否输入,参数的类型也需要检测是否整形。如果不检测就直接使用,代码容易出现异常。//任意给定一个整数,打印出小于等于该整数的所有素数voidmm_print_pn_any(Php::Parameters¶ms){//检查是否必须输入一个参数if(params.size()==0){Php::out<<"错误:需要一个参数"<运行上面的PHP代码,输出是---runningmm_print_pn_any()---error:needaparameter---runningmm_print_pn_any('xyz')---error:parametermustbenumeric---runningmm_print_pn_any(200)---23571113171923293137414347535961677173798389971011031071091131271371391491511571631671731791811911931971994.标量参数,扩展函数写法有返回值函数功能:给定一系列参数,计算它们的和函数名:mm_sum_all注册扩展函数mm_sum_all,注册方法同上Sectionextension.add("mm_sum_all");函数声明及代码如下//获取所有参数的总和Php::Valuemm_sum_all(Php::Parameters¶ms){intsum=0;for(auto¶m:params){//字符串类型可以自动转换为整数sum+=param;}returnsum;}PHP测试代码测试输出结果:sum(1,2,'3','5')=115.数组类型参数,扩展函数写法有返回值函数功能:给定一个数组类型参数,计算所有参数之和数组元素函数名:mm_sum_array注册函数mm_sum_array,注册方法与第一节函数声明和代码相同,如下。//获取数组所有元素的总和Php::Valuemm_sum_array(Php::Parameters¶ms){//没有给定参数,返回0if(params.size()==0){return0;}//参数类型不是数组,转成整数返回if(params[0].type()!=Php::Type::Array){return(int)params[0];}//将数组中的元素一一相加intsum=0;Php::Valuearray=params[0];intsize=array.size();诠释我;for(i=0;i测试输出结果:sum(array(1,3,5,7))=16六、返回值类型为数组的扩展函数写法上述函数的返回值为标量类型,且数组是PHP中特别常用的一种类型。如果要返回数组类型,可以使用c++的std::vector,PHP-CPP会自动将其转换为PHP可识别的数组类型。我们目前的演示函数功能是“返回一个30以内所有质数的数组”。在扩展中注册函数的方法与第一节相同。函数声明和代码如下。//获取30以内的所有素数Php::Valuemm_get_pn_30(){std::vectorpn;整数x=2;整数y=1;while(x<=30){intz=x-y;//z减1withyinta=x%z;//取余if(a==0){//如果x可以被z整除if(z==1){//如果z是1(x是素数)pn.push_back(x);//放入数组}x++;//对x加1y=1;//恢复y}else{//如果不能被y整除++;//对y加1,下一次循环z减1}}returnpn;}PHP测试代码测试输出结果:array(10){[0]=>int(2)[1]=>int(3)[2]=>int(5)[3]=>整数(7)[4]=>整数(11)[5]=>整数(13)[6]=>整数(17)[7]=>整数(19)[8]=>int(23)[9]=>int(29)}七、参考c++素数判断及输出素数表PHP-CPP函数开发帮助