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

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


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

   $x=10;
   $y=20;
   addition($x, $y);

   $x="10";
   $y=20;
   addition($x, $y);

   $x="Hello";
   $y=20;
   addition($x, $y);
?>

它将产生以下输出 -

First number: 10 
Second number: 20 
Addition: 30

First number: 10 
Second number: 20 
Addition: 30

First number: Hello 
Second number: 20
PHP Fatal error:  Uncaught TypeError: Unsupported operand 
types: string + int in hello.php:5

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

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

让我们在下面的 division() 函数的返回值中添加一个类型提示。


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

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

由于该函数返回 0.5,该 0.5 不是 int 类型(即用于函数返回值的类型提示),因此会显示以下错误 -

Fatal error: Uncaught TypeError: division(): Return value must be 
of type int, float returned in hello.php:5