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,它不是int型別(即函式返回值使用的型別提示),因此會顯示以下錯誤

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