PHP - 标量类型声明
提供类型提示的功能自 PHP 5 版本起就已存在。类型提示指的是在函数定义中为参数指定数据类型的做法。在 PHP 7 之前,函数中只能使用 array、callable 和 class 作为类型提示。从 PHP 7 开始,还可以为标量数据类型的参数(如 int、string、bool 等)添加类型提示。
PHP 是一种动态(且弱)类型语言。因此,在定义函数时无需声明参数的类型,而这在像 C 或 Java 这样的静态类型语言中是必需的。
PHP 中典型的函数定义如下 −
function addition($x, $y) {
echo "First number: $x Second number: $y Addition: " . $x+$y;
}
在这里,我们假设参数 $x 和 $y 是数值型的。然而,即使传递给函数的值不是数值型,PHP 解析器也会尽可能地将变量转换为兼容类型。
如果传递的值之一是数字的字符串表示形式,而另一个是数值变量,PHP 会将字符串变量转换为数值型以执行加法运算。
示例
看下面的示例 −
<?php
function addition($x, $y) {
echo "First number: " . $x;
echo "\nSecond number: " . $y;
echo "\nAddition: " . $x+$y;
}
$x="10";
$y=20;
addition($x, $y);
?>
它将产生以下输出 −
First number: 10 Second number: 20 Addition: 30
然而,如果上述示例中的 $x 是一个不包含有效数值表示的字符串,就会遇到错误。
<?php
function addition($x, $y) {
echo "First number: " . $x;
echo "\nSecond number: " . $y;
echo "\nAddition: " . $x+$y;
}
$x="Hello";
$y=20;
addition($x, $y);
?>
运行此代码,看看它如何显示错误。
PHP 7 中的标量类型声明
PHP 7 版本引入的一项新功能允许在括号内为函数参数指定数据类型。
PHP 7 引入了以下标量类型声明 −
Int
Float
Bool
String
Interfaces
Array
Callable
较旧版本的 PHP 只允许使用 array、callable 和 class 类型作为类型提示。此外,在较旧版本的 PHP(PHP 5)中,致命错误是可恢复的,而新版本(PHP 7)返回可抛出的错误。
标量类型声明有两种模式 −
强制模式 − 强制模式是默认模式,无需指定。
严格模式 − 严格模式必须明确指定。
强制模式
前面示例中定义的 addition() 函数现在可以通过添加类型声明来重写如下 −
function addition(int $x, int $y) {
echo "First number: $x Second number: $y Addition: " . $x+$y;
}
注意,解析器仍然会将不兼容类型转换为 int,即如果字符串包含整数,如之前一样。
示例
看下面的示例 −
<?php
function addition(int $x, int $y) {
echo "First number: " . $x;
echo "\nSecond number: " . $y;
echo "\nAddition: " . $x+$y;
}
$x="10";
$y=20;
echo addition($x, $y);
?>
它将产生以下输出 −
First number: 10 Second number: 20 Addition: 30
显然,这是因为 PHP 是弱类型语言,PHP 会尝试将字符串类型的变量强制转换为整数。PHP 7 引入了严格模式功能来解决这个问题。
Strict Mode
为了应对 PHP 的弱类型检查,引入了 strict mode。该模式通过 declare statement 来启用 −
declare (strict_types=1);
你应该将此语句放在 PHP 脚本的顶部(通常就在 PHP 标签下方)。这意味着标量类型的严格性是按文件配置的。
在弱模式下,strict_types 标志为 0。将它设置为 1 会强制 PHP 解析器检查传递的参数和值的兼容性。在上面的代码中添加此语句并检查结果。它将显示以下错误消息 −
Fatal error: Uncaught TypeError: addition():
Argument #1 ($x) must be of type int, string given,
called in add.php on line 12 and defined in add.php:4
Stack trace:
#0 add.php(12): addition('10', 20)
#1 {main}
thrown in add.php on line 4
Example
以下是函数定义中标量类型声明的另一个示例。启用 strict mode 时,如果传递了不兼容的类型作为参数,将引发 fatal error。
<?php
// 严格模式
// declare(strict_types = 1);
function sum(int ...$ints) {
return array_sum($ints);
}
print(sum(2, '3', 4.1));
?>
取消此代码顶部的 declare 语句的注释并运行它。现在它将产生一个 error −
Fatal error: Uncaught TypeError:
sum(): Argument #2 must be of type int, string given,
called in add.php on line 9 and defined in add.php:4
Stack trace:
#0 add.php(9): sum(2, '3', 4.1)
#1 {main}
thrown in add.php on line 4
type-hinting 特性主要被 IDE 用于提示用户函数声明中参数的预期类型。下面的截图显示了 VS Code 编辑器在你输入时弹出函数原型。
