PHP - 标量类型声明



从 PHP 5 版本开始,就提供了类型提示的功能。类型提示指的是在函数定义中提供参数的数据类型的做法。在 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 会将字符串变量强制转换为数字以执行加法运算。

示例

请查看以下示例:

<?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

  • 接口

  • 数组

  • 可调用

较旧版本的 PHP 仅允许将数组、可调用和类类型用作类型提示。此外,在较旧版本的 PHP(PHP 5)中,致命错误曾经是可恢复的错误,而新版本(PHP 7)则返回一个可抛出的错误。

标量类型声明以两种模式实现:

  • 强制模式 - 强制模式是默认模式,不需要指定。

  • 严格模式 - 必须明确提示严格模式。

强制模式

前面示例中定义的 addition() 函数现在可以通过合并类型声明如下重写:

function addition(int $x, int $y) {
   echo "First number: $x Second number: $y Addition: " . $x+$y;
}

请注意,如果字符串包含整数,则解析器仍然会强制转换不兼容的类型,即字符串到整数,就像之前一样。

示例

请查看以下示例:

<?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 引入了一个严格模式功能来解决此问题。

严格模式

为了解决 PHP 的弱类型检查问题,引入了严格模式。此模式通过声明语句启用:

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

示例

以下是函数定义中标量类型声明的另一个示例。启用严格模式时,如果将不兼容的类型作为参数传递,则会引发致命错误。

<?php

   // Strict mode
   // declare(strict_types = 1);
   function sum(int ...$ints) {
      return array_sum($ints);
   }

   print(sum(2, '3', 4.1));
?>

取消此代码顶部的声明语句的注释并运行它。现在它将产生一个错误

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 编辑器弹出的函数原型。

PHP Scalar Type Declarations
广告