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

再学学方法参数类型声明

时间:2023-03-29 17:59:33 PHP

不管你是什么行业,现在学老手是一种趋势,尤其是我们这帮码农。这一次,新技术不用说了。仅仅通过研究PHP文档,你会发现很多知识点你并没有真正掌握,比如这个方法参数的类型声明。在上一篇文章中,关于PHP的方法参数类型约束,我们说过方法参数类型约束仅限于类、接口、数组或可调用的回调函数。其实,这是不严谨的。PHP也有严格的模式定义。如果指定严格模式时,为方法参数类型指定普通标量类型也是有效的。严格模式的定义:declare(strict_types=1);inttypefunctiontestInt(int$a){echo$a,PHP_EOL;}testInt(1);//testInt(1.1);//致命错误:未捕获类型错误:传递给testInt()的参数1必须是int类型//testInt('52AABB');//致命错误:未捕获类型错误:传递给testInt()的参数1必须是int类型//testInt(true);//Fatalerror:UncaughtTypeError:Argument1passedtotestInt()mustbeofthetypeint在严格模式下,很明显这个方法的参数只能接收int类型的值,其他类型不能接收,当然,不会有上一篇文章中提到的强制转换。浮点型函数testFloat(float$a){echo$a,PHP_EOL;}testFloat(1);testFloat(1.1);//testFloat('52AABB');//致命错误:未捕获类型错误:传递给testInt()的参数1必须是int类型//testInt(true);//Fatalerror:UncaughtTypeError:Argument1passedtotestInt()mustbeofthetypeint这里要注意PHP只有int和float,而float是int的超集,所以这里可以传整数,但是上面的testInt(int$a)不能像1.1那样接收float值。这就涉及到上下转换的问题。转换成超集是可以的,但是从超集转换成子集就不行了。字符串类型函数testString(string$a){echo$a,PHP_EOL;}//testString(1);//致命错误:未捕获类型错误:传递给testString()的参数1必须是字符串类型//testString(1.1);//致命错误:未捕获类型错误:传递给testString()的参数1的类型必须为stringtestString('52AABB');//testString(true);//Fatalerror:UncaughtTypeError:Argument1passedtotestString()mustbethetypestring无需过多解释。在非严格模式下,如果我们定义string类型的接收参数,其实任何类型都可以作为string类型接收,这里的类型转换就不多说了,可以说效果如下在非严格模式下定义字符串类型与不定义是一样的。但是在严格模式下就不一样了。它确实只能接收双引号或单引号内的字符串内容。bool类型函数testBool(bool$a){var_dump($a);}testBool(true);testBool(false);//testBool('52AABB');//致命错误:未捕获类型错误:传递给testBool()的参数1必须是bool类型//testBool(1);//Fatalerror:UncaughtTypeError:Argument1passedtotestBool()mustbethetypeboolisalsothesame,这里我们只能接收true和false关键字的值。学习一种新的可迭代类型最后,让我们介绍一个新人。除了普通模式下的类、数组、回调函数,以及严格模式下的各种标量类型声明外,还有可迭代类型的声明。我相信每个人都会用到这个词。注意,可迭代类型。functiontestIterable(iterable$iterator){echogettype($iterator),':',PHP_EOL;foreach($iteratoras$it){echo$it,PHP_EOL;}}testIterable([1,2,3]);testIterable(newArrayIterator([1,2,3]));//生成器对象testIterable((function(){yield1;yield2;yield3;})());//可迭代测试(1);//Fatalerror:UncaughtTypeError:Argument1passedtotestIterable()mustbeiterable是的,它包括数组,实现迭代器接口的类,生成器相关的内容。即所有foreach可以迭代的内容都可以通过。生成器本身会是一个Generator对象,而在这篇学习PHP生成器使用的文章中,我们已经看到了这个Generator对象的内容,它本身也实现了Iterator接口。总结如开头所说,原来我们的语法在严格模式下会有这么大的差异,这次真是长见识了。我们的学习路还很长,希望大家继续关注,一起努力!!测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202003/source/%E5%86%8D%E6%AC%A1%E5%AD%A6%E4%B9%A0%E6%96%B9%E6%B3%95%E5%8F%82%E6%95%B0%E7%B1%BB%E5%9E%8B%E5%A3%B0%E6%98%8E。PHP参考文档:《PHP7编程实战》https://wiki.php.net/rfc/scalar_type_hints_v5https://www.php.net/manual/zh/class.generator.phphttps://wiki.php.net/rfc/iterable各媒体平台均可搜索【硬核项目经理】