在解释 PHP 的严格类型之前,我们先执行下面的程序。
<?php
function sum($a, $b)
{
return $a + $b;
}
echo sum(1, 2.5); // output 3.5
?>
上面的程序用于找到两个给定数字的和。因此输出结果为 3.5。
标量类型声明
在 PHP 7.0 中引入了 标量类型声明。标量 类型声明 有两种模式,强制(默认)和严格。
现在我们将为函数参数添加类型声明。
<?php
function sum(int $a, int $b)
{
return $a + $b;
}
echo sum(1, 2.5); // output 3
?>
现在你会得到输出结果 3。为什么?PHP 自动将输入参数的类型更改为 int(第二个参数 2.5 转换为 int)。这被称为强制模式。
PHP 中的严格类型是什么?
因此,根据我们的函数参数类型声明,函数应该接受整数值。如果传递非整数值,则程序将抛出错误,这可以通过使类型声明严格来实现。
如何启用严格类型?
我们可以在每个文件的基础上启用严格模式。为了启用严格类型,使用 declare
语句与 strict_types
声明。
严格类型声明仅适用于已声明的文件。目前没有全局应用严格类型的选项。
在严格模式下,只有与类型声明完全对应的值才会被接受,否则将抛出 TypeError。
<?php
declare(strict_types=1);
?>
将严格类型声明为 sum 函数
<?php
declare(strict_types=1);
function sum(int $a, int $b)
{
return $a + $b;
}
echo sum(1, 2.5);
?>
在声明严格类型后,你将获得以下致命错误。
Fatal error: Uncaught TypeError: sum(): Argument #2 ($b) must be of type int, float given, called in C:\xampp\htdocs\test.php on line 8 and defined in C:\xampp\htdocs\test.php:4 Stack trace: #0 C:\xampp\htdocs\test.php(8): sum(1, 2.5) #1 {main} thrown in C:\xampp\htdocs\test.php on line 4
现在我们了解了强制模式和严格模式的类型声明基础知识。
返回类型声明
我们还可以声明函数返回值的类型。
<?php
// Coercive mode
function sum(int $a, int $b): int
{
$c = 0.5;
return $a + $b + $c;
}
echo sum(1, 2); // Output 3
?>
在添加 $c = 0.5 后,上面程序的输出为 3。因为我们将返回类型声明为整数。如果声明的返回类型是 float
,则输出结果为 3.5。
严格类型与返回类型
在添加严格类型后,你将获得致命错误,因为返回值不是整数。
<?php
declare(strict_types=1);
function sum(int $a, int $b): int
{
$c = 0.5;
return $a + $b + $c;
}
echo sum(1, 2);
?>
Fatal error: Uncaught TypeError: sum(): Return value must be of type int, float returned in C:\xampp\htdocs\test.php:7 Stack trace: #0 C:\xampp\htdocs\test.php(10): sum(1, 2) #1 {main} thrown in C:\xampp\htdocs\test.php on line 7
为什么使用严格类型?
如果你在代码中使用标量类型声明,则最好使用严格类型,因为它有助于防止错误。否则,不需要使用严格类型声明。
结论
我看到很多 PHP 包开始使用严格类型。正如前面所说,如果使用类型声明,则严格类型最好用于避免错误。那么你还在等什么呢?开始使用严格类型!
请在 PHP 中使用严格类型时分享你的评论。
参考
谢谢阅读。
译自:https://blog.devgenius.io/start-using-strict-typing-in-php-897301e54e3d
评论(0)