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 addition($x, $y) {
   echo "First number: $x Second number: $y Addition: " . $x+$y;
}

类型提示功能主要由 IDE(集成开发环境)使用,用于提示用户函数声明中使用的参数的预期类型。

下图显示了 VS Code 编辑器在您键入时弹出的函数原型:

PHP Type Hints 1

如果光标悬停在函数名称上,则会显示参数和返回值的类型声明:

PHP Type Hints 2

请注意,仅仅在变量声明中使用数据类型并不能防止不匹配的类型异常,因为 PHP 是一种动态类型语言。换句话说,$x="10" 和 $y=20 仍然会将结果相加为 30,而 $x="Hello" 会使解析器引发错误。

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

VS Code IDE 也指示了相同效果的错误:

PHP Type Hints 3

从 PHP 7 开始,类型提示支持已扩展到函数返回值,以防止出现意外的返回值。您可以通过在参数列表后添加预期的类型来进行返回值类型提示,并在其前面加上冒号 (:) 符号。

示例

让我们为上面加法函数的返回值添加类型提示:

<?php
   declare (strict_types=1);
   function addition(int $x, int $y) : int {
      return $x+$y;
   }

   $x=10;
   $y=20;

   $result = addition($x, $y);
   echo "First number: $x Second number: $y Addition: " . $result;
?>

同样,如果发现函数返回的任何内容不是整数,IDE 甚至在您运行之前就会指出原因。

PHP Type Hints 4

联合类型

PHP 在 8.0 版本中引入了联合类型。您现在可以为单个声明指定多个类型。数据类型之间用“|”符号分隔。

示例

在下面的 addition() 函数定义中,$x$y 参数可以是intfloat 类型。

<?php
   declare (strict_types=1);
   function addition(int|float $x, int|float $y) : float {
      return $x+$y;
   }
   $x=10.55;
   $y=20;

   $result = addition($x, $y);
   echo "First number: $x Second number: $y Addition: " . $result;
?>

类中的类型提示

在 PHP 中,从 7.4 版本开始,您可以在类属性和方法的声明中使用类型提示。

示例

在下面的示例中,类构造函数使用类型提示:

<?php
   declare (strict_types=1);
   class Student {
      public $name;
      public $age;
      public function __construct(string $name, int $age) {
         $this->name = $name;
         $this->age = $age;
      }

      public function dispStudent() {
         echo "Name: $this->name Age: $this->age";
      }
   }
   $s1 = new Student("Amar", 21);
   $s1->dispStudent();
?>

也可以在类属性的声明中使用类型提示。

class Student {
   public string $name;
   public int $age;

   public function __construct($name, $age) {
      $this->name = $name;
      $this->age = $age;
   }

   public function dispStudent() {
      echo "Name: $this->name Age: $this->age";
   }
}

程序开发过程中最常见的错误是类型错误。类型提示功能有助于减少此类错误。

广告