PHP 标量类型声明怎么用?

文章导读
上一个 测验 下一个 提供类型提示的功能自 PHP 5 版本起就已存在。类型提示指的是在函数定义中为参数指定数据类型的做法。在 PHP 7 之前,函数中只能使用 array、callable 和 class 作为类型提示。从 PHP 7 开始,还可以为标量数据类型的参数(如
📋 目录
  1. A 示例
  2. B PHP 7 中的标量类型声明
  3. C 强制模式
  4. D Strict Mode
A A

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 编辑器在你输入时弹出函数原型。

PHP Scalar Type Declarations