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

28次阅读

共计 1465 个字符,预计需要花费 4 分钟才能阅读完成。

在之前的文章 PHP 办法参数的那点事儿中,咱们讲过对于 PHP 办法参数的一些小技巧。明天,咱们带来的是更加深刻的钻研一下 PHP 中办法的参数类型。

在 PHP5 之后,PHP 正式引入了办法参数类型束缚。也就是如果指定了办法参数的类型,那么传不同类型的参数将会导致谬误。在 PHP 手册中,办法的类型束缚仅限于类、接口、数组或者 callable 回调函数。如果指定了默认值为 NULL,那么咱们也能够传递 NULL 作为参数。

class A{}
function testA(A $a){var_dump($a);
}

testA(new A());
// testA(1); 
// Fatal error: Uncaught TypeError: Argument 1 passed to testA() must be an instance of A, int given,

在这个例子中,咱们定义了参数类型为 A 类,所以当咱们传递一个标量类型时,间接就会返回错误信息。

function testB(int $a){var_dump($a);
}
testB(1);
testB('52aadfdf'); // 字符串强转为 int 了
// testB('a');
// Fatal error: Uncaught TypeError: Argument 1 passed to testB() must be of the type int, string given

function testC(string $a){var_dump($a);
}
testC('测试');
testC(1);  // 数字会强转为字符串
// testC(new A()); 
// Fatal error: Uncaught TypeError: Argument 1 passed to testC() must be of the type string

在手册中明确阐明了标量类型是不能应用类型束缚的。但其实是能够应用的,不过如果都是标量类型则会进行互相的强制转换,并不能起到很好的束缚作用。比方上例中 int 和 string 类型进行了互相强制转换。指定了非标量类型,则会报错。此处是本文的重点,小伙伴们可要划个线了哦。其实说白了,如果咱们想指定参数的类型为固定的标量类型的话,在参数中指定并不是一个好的抉择,最好还是在办法中进行再次的类型判断。而且如果参数中进行了强转,也会导致办法外部的判断产生偏差。

最初咱们再看一看接口和匿名办法的类型束缚。匿名参数类型在 Laravel 等框架中十分常见。

// 接口类型
interface D{}
class childD implements D{}
function testD(D $d){var_dump($d);
}
testD(new childD());

// 回调匿名函数类型
function testE(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

===========

各自媒体平台均可搜寻【硬核项目经理】

正文完
 0