Php 简明教程
PHP - Scalar Type Declarations
提供类型提示的功能自 5.0 版本起已内置于 PHP 中。 Type hinting 指在函数定义中提供参数数据类型的方法。在 PHP 7 之前,在函数中只能对数组、可调用和类使用类型提示。从 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 会将字符串变量强制转换为数字以执行加法操作。
Example
请查看以下示例:
<?php
function addition($x, $y) {
echo "First number: " . $x;
echo "\nSecond number: " . $y;
echo "\nAddition: " . $x+$y;
}
$x="10";
$y=20;
addition($x, $y);
?>
它将生成以下 output −
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);
?>
运行此代码并查看它如何显示 error 。
Scalar Type Declarations in PHP 7
PHP 7 版本引入的一项新功能允许定义一个函数,其参数的数据类型可以在括号中指定。
PHP 7 引入了以下标量类型声明 −
-
Int
-
Float
-
Bool
-
String
-
Interfaces
-
Array
-
Callable
旧版本的 PHP 只允许使用数组、可调用和类类型作为类型提示。此外,在旧版本的 PHP(PHP 5)中,致命错误为可恢复错误,而新版本(PHP 7)返回可抛出错误。
标量类型声明以两种模式实现 −
-
Coercive Mode − 强制是默认模式,无需指定。
-
Strict Mode − 必须显式提示严格模式。
Coercive Mode
前面示例中定义的 addition() 函数现在可以重新编写,方法是合并类型声明,如下所示:
function addition(int $x, int $y) {
echo "First number: $x Second number: $y Addition: " . $x+$y;
}
注意,如果字符串包含一个整数,解析器仍会将不兼容的类型(即字符串)强制转换为 int,就像以前一样。
Example
请查看以下示例:
<?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);
?>
它将生成以下 output −
First number: 10
Second number: 20
Addition: 30
很明显,这是因为 PHP 是一种弱类型语言,因为 PHP 尝试将字符串类型的变量强制转换为整数。PHP 7 引入了解决此问题的严格模式功能。
Strict Mode
为了应对 PHP 的弱类型检查,已引入严格模式。此模式启用一个 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
以下是函数定义中标量类型声明的另一个示例。启用严格模式后,如果将不兼容的类型作为参数传递,则会引发致命错误。
<?php
// Strict mode
// 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
类型提示功能主要由 IDE 用于提示用户有关函数声明中使用的参数的预期类型的信息。以下屏幕截图显示了键入时 VS Code 编辑器弹出函数原型。