本篇文章给大家介绍一下学习方法参数类型声明的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
不管从事什么行业,现在都是活到老学到老的趋势,特别是我们这堆码农。这回也不用说新技术用不上,光光是PHP文档的学习都会发现非常多的知识点其实自己并没有真正的掌握,比如说这个方法参数的类型声明。上次文章中,关于PHP的方法参数类型约束,我们说过方法参数的类型约束仅限于类、接口、数组或者callable回调函数,其实这是不严谨的,PHP中也有一个严格模式的定义,如果指定了严格模式的话,普通的为方法参数类型指定普通的标量类型也是有效果的。
严格模式的定义:
declare (strict_types = 1);
int 类型
function testInt(int $a) { echo $a, PHP_EOL; } testInt(1); // testInt(1.1); // Fatal error: Uncaught TypeError: Argument 1 passed to testInt() must be of the type int // testInt('52AABB'); // Fatal error: Uncaught TypeError: Argument 1 passed to testInt() must be of the type int // testInt(true); // Fatal error: Uncaught TypeError: Argument 1 passed to testInt() must be of the type int
在严格模式下,很明显地看出现在这个方法的参数只能接收 int 类型的值了,其他的类型都无法接收,当然也不会像之前文章说过的那样会发生强制转换。
float 类型
function testFloat(float $a) { echo $a, PHP_EOL; } testFloat(1); testFloat(1.1); // testFloat('52AABB'); // Fatal error: Uncaught TypeError: Argument 1 passed to testInt() must be of the type int // testInt(true); // Fatal error: Uncaught TypeError: Argument 1 passed to testInt() must be of the type int
这里需要注意的是,PHP只有 int 和 float,而且 float 是 int 的超集,所以这里是可以传整数过来的,不过上面的 testInt(int $a) 则不能接收 1.1 这样的 float 值。这就涉及到了上下转换的问题,向超集转换是OK的,但是超集向子集转换是就不OK了。
string 类型
function testString(string $a) { echo $a, PHP_EOL; } // testString(1); // Fatal error: Uncaught TypeError: Argument 1 passed to testString() must be of the type string // testString(1.1); // Fatal error: Uncaught TypeError: Argument 1 passed to testString() must be of the type string testString('52AABB'); // testString(true); // Fatal error: Uncaught TypeError: Argument 1 passed to testString() must be of the type string
这个就不用过多解释了,在非严格模式下我们如果定义 string 类型的接收参数的话,其实是任何类型都可以接收过来做为 string 类型的,这里的类型转换就不多说了,可以说在非严格模式下定义 string 类型的效果跟没有任何定义是一样的。但是严格模式下就不同了,真的是只能接收双引或者单引号之内的字符串内容。
bool 类型
function testBool(bool $a) { var_dump($a); } testBool(true); testBool(false); // testBool('52AABB'); // Fatal error: Uncaught TypeError: Argument 1 passed to testBool() must be of the type bool // testBool(1); // Fatal error: Uncaught TypeError: Argument 1 passed to testBool() must be of the type bool
布尔值也是同理的,这里我们也来源[email protected]搞@^&代*@码网只能接收 true 和 false 关键字的值。