首页
Preview

开始在PHP中使用严格类型检查

在解释 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

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
anko
宽以待人处事,严于律己修身。

评论(0)

添加评论