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

关于PHP的方法参数类型约束

时间:2023-03-29 16:31:44 PHP

在之前关于PHP方法参数的文章中,我们讲了关于PHP方法参数的一些小技巧。今天,我们更深入地了解一下PHP中方法的参数类型。PHP5之后,PHP正式引入了方法参数类型约束。也就是说,如果指定了方法参数的类型,则传递不同类型的参数将导致错误。在PHP手册中,方法类型约束仅限于类、接口、数组或可调用的回调函数。如果指定了默认值NULL,那么我们也可以将NULL作为参数传递。A类{}函数testA(A$a){var_dump($a);}testA(newA());//testA(1);//Fatalerror:UncaughtTypeError:Argument1passedtotestA()mustbeaninstanceofA,intgiven,在这个例子中,我们将参数类型定义为类A,因此当我们传递标量类型时,会出现错误信息直接退回。函数testB(int$a){var_dump($a);}testB(1);testB('52aadfdf');//字符串被强制为int//testB('a');//致命错误:未捕获类型错误:传递给testB()的参数1必须是int类型,字符串givenfunctiontestC(string$a){var_dump($a);}testC('测试');testC(1);//数字将是强转换为字符串//testC(newA());//Fatalerror:UncaughtTypeError:Argument1passedtotestC()mustbeofthetypestring手册中明确指出标量类型不能使用类型约束。但是其实是可以用的,但是如果都是标量类型的话,就会相互强制,不能起到很好的限制作用。例如,在上面的示例中,int和string类型相互强制转换。如果指定了非标量类型,则会报错。这是本文的重点,朋友们,你们要划清界限。其实说白了,如果我们想把参数的类型指定为固定的标量类型,在参数中指定并不是一个好的选择。最好在方法中再做一次类型判断。而且,如果参数中存在强制切换,也会导致方法内部判断出现偏差。最后,我们来看一下接口和匿名方法的类型约束。匿名参数类型在Laravel等框架中非常常见。//接口类型interfaceD{}classchildDimplementsD{}functiontestD(D$d){var_dump($d);}testD(newchildD());//回调匿名函数类型functiontestE(Callable$e,string$data){$e($data);}testE(function($data){var_dump($data);},'回调函数');测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202001/%E5%85%B3%E4%BA%8EPHP%E7%9A%84%E6%96%B9%E6%B3%95%E5%8F%82%E6%95%B0%E7%B1%BB%E5%9E%8B%E7%BA%A6%E6%9D%9F.md参考文档:https://www.php.net/manual/zh/language.oop5.typehinting.php============各媒体平台均可搜索【硬核项目经理】