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
廣告