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

PHP扩展开发教程5——扩展函数的参数类型(一)

时间:2023-03-30 02:20:05 PHP

PHP扩展是高级PHP程序员必须掌握的技能之一。对于初学者PHP扩展开发者,如何开发成熟的扩展,进入PHP开发的高级领域呢?本系列开发教程将带您从初级到高级。本教程系列在linux下开发(推荐centos),php版本使用5.6,假设你有一定的linux操作经验和c/c++基础。如果大家有什么问题需要交流,欢迎加入QQ技术交流群32550793与我交流。前面两节介绍了如何用PHP-CPP编写常用的扩展函数和扩展类。您应该已经熟悉如何使用PHP-CPP开发扩展。下面我们先来了解一下扩展函数的参数类型。以下教程内容相关源码已上传至github。gitclonehttps://github.com/elvisszhang/phpcpp_param.git1.相关知识:PHP-CPP参数类型指定方法有时候,我们开发的函数,希望只能传入特定的类型,比如字符串操作函数只能传入字符串参数,进行数值运算的函数只能传入数值参数,进行数组运算的函数只能传入数组参数。以下是如何在扩展中指定函数参数类型的示例代码:ExtensionmyExtension("my_extension","1.0");myExtension.add("example",{Php::ByVal("a",Php::Type::Numeric),Php::ByVal("b","ExampleClass"),Php::ByVal("c","其他类")});返回我的扩展;}}上面的Php::ByVal是代表值类型的参数的设置方法,你应该猜到相关的对应的,还有Php::ByRef代表引用类型的参数设置方法。遗憾的是,在php5.x扩展上,经过实验证明引用方法的参数设置是无效的。2、相关知识:Php::ByVal函数说明Php::ByVal是代表值类型的参数的设置方法,一共有两个函数原型定义。第一个原型用于参数类型,例如标量、数组、对象和匿名函数。C++函数定义如下。/***ByVal值类型参数设置方法*@paramname参数名称*@paramtype参数类型*@paramrequired参数必填,默认必填*/ByVal(constchar*name,Php::Typetype,boolrequired=真);第二个原型用于具有特定类名的函数参数,其C++函数定义如下。/***ByVal值类型参数设置方法*@paramname参数名*@paramclassname参数类名*@paramnullable是否可以为空*@paramrequired参数是否必填,默认必填*/ByVal(constchar*name,constchar*classname,boolnullable=false,boolrequired=true);值得注意的是PHP中没有所谓的函数参数名,上面函数参数中的名字只是一个助记符,主要用在参数类型错误等异常情况下抛出异常的错误信息中,以便用户可以知道哪个参数有问题。3、相关知识:Php::Type参数类型说明Php::Type在ByVal函数中是一个C++枚举,代表PHP-CPP的函数参数,一共支持以下11种类型。Php::Type::Null-表示可以传入任何类型Php::Type::Numeric-整数类型Php::Type::Float-数值类型,支持整数、单精度浮点数、双精度精度浮点数Php::Type::Bool-布尔类型Php::Type::Array-数组类型Php::Type::Object-对象类型Php::Type::String-字符串类型Php::Type::Resource-资源类型(持有用于打开文件、数据库连接、图形画布区域等的特殊句柄)Php::Type::Constant-常量类型Php::Type::ConstantArray-常量数组类型Php::Type::Callable-Php::Type::Array或Php::Type::Object之外的函数类型这两种类型的参数使用起来比较特殊,必须用专门对应的C++类来操作。其他类型的用法基本没有太大区别,因为重载了PHP::Value类。4.代码演示:阶乘运算对于阶乘运算函数,我们都知道需要也只需要传入一个正整数类型即可。下面是扩展函数的C++源码//demonstrationfactorialPhp::Valuepm_factorial(Php::Parameters¶ms){intn=(int)params[0];如果(n<0)返回0;诠释我,f=1;对于(i=1;i<=n;i++)f*=i;returnf;}注册扩展函数代码myExtension.add("pm_factorial",{Php::ByVal("a",Php::Type::Numeric)});PHP测试代码(test/1.php)Testreturnresult#phptest/1.php-----TESTpm_factorial()-----PHPWarning:pm_factorial()expectsatleast1parameter(s),0givenin中/data/develop/phpcpp_param/test/1.phponline3NULL-----TESTpm_factorial('abc')-----int(1)-----TESTpm_factorial('5')-----int(120)-----测试pm_factorial(0)-----int(1)-----测试pm_factorial(10)-----int(3628800)-----TESTpm_factorial(-10)-----int(0)-----TESTpm_factorial(5.3)-----int(120)根据上面的测试结果可以得出:对于整型参数,它将自动将浮点数强制转换为参数不足的整数,将生成PHP警告并返回NULL。整型参数自动转为字符串类型,无法转为0。5、代码演示:添加两个数值(浮点)类型参数以两个数值相加为例进行演示,我们要传入两个参数,两个参数都是数值类型。下面是扩展函数的C++源码//两个数相加的演示Php::Valuepm_add(Php::Parameters¶ms){returnparams[0]+params[1];}注册扩展函数代码myExtension.add("pm_add",{Php::ByVal("a",Php::Type::Float),Php::ByVal("b",Php::Type::Float)});PHP测试代码(test/2.php)运行测试代码并返回结果#phptest/2.php-----TESTpm_add()-----PHPWarning:pm_add()expects至少2个参数,0在/data/develop/phpcpp_param/test/1.php第3NULL-----TESTpm_中给出add(1)-----PHPWarning:pm_add()expectsatleast2parameter(s),1givenin/data/develop/phpcpp_param/test/1.phponline6NULL-----TESTpm_add('abc','def')-----int(0)-----测试pm_add('1','2')-----int(3)-----测试pm_add(1,2)-----int(3)-----TESTpm_add(1.3,2.4)-----float(3.7)根据上面的测试结果可以得出:对于数值类型parameters,integers,floating-pointnumbers支持的参数不足时,会产生PHP警告,返回值为NULL。数值类型的参数自动转换为字符串类型的数值,无法转换则转换为0。限于篇幅,其他参数类型将在下一章继续演示。6.参考PHP-CPP官网-关于函数参数