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 引入了以下标量类型声明 −

  1. Int

  2. Float

  3. Bool

  4. String

  5. Interfaces

  6. Array

  7. Callable

旧版本的 PHP 只允许使用数组、可调用和类类型作为类型提示。此外,在旧版本的 PHP(PHP 5)中,致命错误为可恢复错误,而新版本(PHP 7)返回可抛出错误。

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

  1. Coercive Mode − 强制是默认模式,无需指定。

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

php scalar type declarations