PHP扩展是高级PHP程序员必须掌握的技能之一。对于初学者PHP扩展开发者,如何开发成熟的扩展,进入PHP开发的高级领域呢?本系列开发教程将带您从初级到高级。本教程系列在linux下开发(推荐centos),php版本使用5.6,假设你有一定的linux操作经验和c/c++基础。如果大家有什么问题需要交流,欢迎加入QQ技术交流群32550793与我交流。继续上一节的内容,讲解一下扩展函数的参数类型。以下教程内容相关源码已上传至github。请参阅param子目录中的演示代码。gitclonehttps://github.com/elvisszhang/phpcpp_demo.gitcdparam1.代码演示:对象类作为参数的用法这里我们使用PHP的DateTime类作为扩展函数的参数来演示如何传入一个对象。以下是扩展函数的C++源码。//演示时间类型操作voidpm_datetype(Php::Parameters¶ms){Php::Valuetime=params[0];Php::out<<"参数类型是:"<("pm_datetype",{/****"time":表示参数名,用在返回的异常信息中使用"DateTime":参数对象的类名true:表示需要参数****/Php::ByVal("time","DateTime",true)});PHP测试代码(test/3.php)执行测试代码,结果如下遵循#phptest/3.php-----TESTpm_datetype($time)-----2018-04-1719:57:57-----TESTpm_datetype('2018-04-17')-----PHPCatchablefatalerror:Argument1passedtopm_datetype()mustbeaninstanceofDateTime,在/data/develop/phpc中给出的字符串pp_param/test/3.phponline7根据测试结果可以看出,参数类型指定为特定类的对象后,传入其他类型的参数会触发致命错误的产生。可以使用Php::Value的调用方法来执行对象类Function方法,非常方便2.代码演示:匿名函数或函数名作为参数类型。我们都知道C++的模板类可以让同一个类处理多种数据类型,非常强大。下面实现一个冒泡排序算法,使用匿名函数作为参数,使得这个冒泡排序算法也可以对各种类型元素的数组进行排序,无论是正向还是反向,数字或者文本或者复杂结构的元素都可以排序。下面是扩展函数的C++源码//通用冒泡排序类的演示Php::Valuepm_sort(Php::Parameters¶ms){inti,j;Php::Valuearray=params[0];Php::Valuecmpfunc=params[1];intlen=array.size();Php::Valueresult,temp;for(i=0;i("pm_sort",{Php::ByVal("a",Php::Type::Array),//The第一个是数组TypePhp::ByVal("b",Php::Type::Callable)//第二个是函数类型});PHP测试代码(test/4.php)$a向上冒泡,所以是降序排序return$b>$a;});echovar_export($result);回声PHP_EO大号。'-----数字升序-----'.PHP_EOL;$result=pm_sort(array(22,3,15),function($a,$b){//$b<$a然后往上冒泡,所以是升序return$b<$a;});echovar_export($result);echoPHP_EOL。'-----学生成绩降序-----'.PHP_EOL;$score=array(array('name'=>'张三','score'=>78),array('name'=>'李四','score'=>98),array('name'=>'王舞','score'=>88),);$result=pm_sort($score,function($a,$b){//$b['score']>$a['score']然后冒泡起来,所以按照结果降序排列return$b['score']>$a['score'];});echovar_export($result);echoPHP_EOL。'-----Character字符串按长度-----升序排列。PHP_EOL;functioncmp_strlen($a,$b){//strlen($b)运行测试代码,输出如下#phptest/4.php-----数字降序-----数组(0=>22,1=>15,2=>3,)-----数字升序order-----array(0=>3,1=>15,2=>22,)-----学生成绩降序排列-----array(0=>array('name'=>'李四','score'=>98,),1=>array('name'=>'王武','score'=>88,),2=>array('name'=>'张三','score'=>78,),)-----字符串按长度升序排列-----数组(0=>'I',1=>'my',2=>'love',3=>'country',)-----姓名首字母升序排列-----数组(0=>'Jack',1=>'Michael',2=>'Smith',3=>'Tom',)根据上面的测试代码可以看出,函数类型的参数可以是匿名函数,函数类型的参数也可以是函数名字符串类型。函数类型的参数也可以是类的静态函数将函数名作为函数类型的参数传入,有助于实现高效简洁的代码。3、代码演示:引用类型的参数类型根据官网文档,PHP-CPP支持引用类型,官方文档也给出了一个swap的demo代码(参数值交换),我们来做个实验根据官方网站上的文档。不幸的是,你会发现PHP5.x的这个特性是不支持的,PHP7.x系列可能会支持。有条件的可以去试试。下面是扩展函数的C++源码//测试引用类型参数voidpm_swap(Php::Parameters¶ms){Php::Valuetemp=params[0];参数[0]=参数[1];params[1]=temp;}注册这个扩展函数的代码如下myExtension.add("pm_swap",{Php::ByRef("a",Php::Type::Numeric),Php::ByRef("b",Php::Type::Numeric)});PHP测试代码(test/5.php)$a=123;$b=456;echo'交换前:$a='.$一个。'$b='.$乙。PHP_EOL;pm_swap($a,$b);echo'afterswap:$a='.$一个。'$b='.$b。PHP_EOL;//如果直接输入常量,类型检测会失败,引发php错误。//pm_swap(10,20);运行测试代码,交换前输出结果如下:$a=123$b=456交换后:$a=123$b=456根据测试结果,$a和$b的值为还是Keepitisis,没有swapping,所以引用类型的参数在PHP5.x中其实是不支持的。PHP7.x是否支持需要进一步实验。4.参考PHP-CPP官网-关于函数参数PHP-CPP官网-关于Lambda函数