PHP - 标量类型声明



提供类型提示的功能从 PHP 版本 5 开始就已经存在。类型提示是指在函数定义中提供参数数据类型的做法。在 PHP 7 之前,函数中可以只使用 arraycallableclass 来表示类型提示。

从 PHP 7 开始,您还可以为标量数据类型的参数(如 intstringbool 等)插入类型提示。

PHP 是一种动态(且弱)类型的语言。因此,在定义函数时,您不需要声明参数的类型,这在 CJava 等静态类型语言中是必需的。

PHP 中函数的典型定义如下 -


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

这里,我们假设参数 $x$y 是数值。但是,即使传递给函数的值不是数字,PHP 解析器也会尝试尽可能将变量转换为兼容的类型。

如果传递的值之一是一个数字的字符串表示,而另一个是数字变量,PHP 会将字符串变量强制转换为 numeric 以执行加法运算。

看看下面的例子 -


<?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 只允许将 arraycallableclass 类型用作类型提示。此外,在旧版本的 PHP (PHP 5) 中,致命错误曾经是可恢复的错误,而新版本 (PHP 7) 返回可抛出的错误。

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

  • 强制模式 − 强制是默认模式,无需指定。
  • 严格模式 - 必须明确提示严格模式。

强制模式

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


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

请注意,解析器仍然会将不兼容的类型(即 string)转换为 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 引入了一个严格模式功能来解决这个问题。

严格模式

为了应对 PHP 的弱类型检查,引入了 strict 模式。此模式通过 declare 语句启用 -


 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_types = 1);
   function sum(int ...$ints) {
      return array_sum($ints);
   }

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

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

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 标量类型声明