PHP - 严格类型
PHP 被广泛认为是弱类型语言。在 PHP 中,你无需在给变量赋值前声明其类型。PHP 解析器会尽可能将变量转换为兼容的类型。
例如,如果传递的值之一是数字的字符串表示,而另一个是数字变量,PHP 会将字符串变量转换为数字类型以执行加法运算。
加法运算中的自动类型转换
PHP 会将字符串转换为数字以执行加法运算。请看下面的示例 −
<?php
function addition($x, $y) {
echo "First number: $x Second number: $y Addition: " . $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 Second number: $y Addition: " . $x+$y;
}
$x="Hello";
$y=20;
addition($x, $y);
?>
它将产生以下输出 −
PHP Fatal error: Uncaught TypeError: Unsupported operand types: string + int in hello.php:5
类型提示
从 PHP 5.6 版本开始支持类型提示。这意味着你可以明确声明代码中变量的预期类型。PHP 允许对 function 参数、返回值和 class 属性进行类型提示。这样可以编写更健壮的代码。
让我们在上面的程序的 addition function 中加入类型提示 −
function addition(int $x, int $y) {
echo "First number: $x Second number: $y Addition: " . $x+$y;
}
注意,仅仅在变量声明中使用数据类型并不能防止类型不匹配异常,因为 PHP 是动态类型语言。换句话说,$x="10" 和 $y=20 仍然会计算出加法结果 30,而 $x="Hello" 会导致解析器抛出错误。
示例
<?php
function addition($x, $y) {
echo "First number: $x \n";
echo "Second number: $y \n";
echo "Addition: " . $x+$y . "\n\n";
}
$x=10;
$y=20;
addition($x, $y);
$x="10";
$y=20;
addition($x, $y);
$x="Hello";
$y=20;
addition($x, $y);
?>
它将产生以下输出 −
First number: 10 Second number: 20 Addition: 30 First number: 10 Second number: 20 Addition: 30 First number: Hello Second number: 20 PHP Fatal error: Uncaught TypeError: Unsupported operand types: string + int in hello.php:5
使用 strict_types
PHP 可以强制执行更严格的类型转换规则,从而避免将 "10" 隐式转换为 10。这可以通过在 declare() 语句中将 strict_types 指令设置为 1 来强制执行。
declare() 语句必须是 PHP 代码中的第一个语句,就在 "<?php" 标签之后。
示例
查看以下示例 −
<?php
declare (strict_types=1);
function addition(int $x, int $y) {
echo "First number: $x Second number: $y Addition: " . $x+$y;
}
$x=10;
$y=20;
addition($x, $y);
?>
它将产生以下 输出 −
First number: 10 Second number: 20 Addition: 30
现在,如果将 $x 设置为 "10",则不会发生隐式转换,从而导致以下 错误 −
PHP Fatal error: Uncaught TypeError: addition(): Argument #1 ($x) must be of type int, string given
从 PHP 7 开始,类型提示支持已扩展到 function 返回值,以防止意外的返回值。你可以通过在参数列表后添加冒号 (:) 符号前缀的预期类型来为返回值添加类型提示。
示例
让我们为下面的 division() function 的返回值添加类型提示。
<?php
declare (strict_types=1);
function division(int $x, int $y) : int {
return $x/$y;
}
$x=10;
$y=20;
$result = division($x, $y);
echo "First number: $x Second number: $y Addition: " . $result;
?>
因为该 function 返回 0.5,它不是 int 类型(即用于 function 返回值的类型提示),因此会显示以下 错误 −
Fatal error: Uncaught TypeError: division(): Return value must be of type int, float returned in hello.php:5
PHP 严格类型的好处
以下是在你的代码中使用严格类型的好处 −
严格类型提高了代码的可靠性,确保类型安全,减少因不正确的数据类型导致的运行时错误风险。
显式类型定义通过使代码自解释和易懂来提高代码可读性。
当开发者了解不同类型的变量时,更容易更改和更新代码,而不会引入新错误。