PHP 7 之後,function、Class 等等都可以指定型態、回傳的型態,但是雖然寫 int,傳進來還是可以傳 float,要怎麼強制型態不對就直接出錯誤呢?
function 指定型態完整寫法
<?php function sum(int $a, int $b): int { return $a + $b; } function avg(int $a, int $b): float { return ($a + $b) / 2; } // Class class C {} class D extends C {} function f(C $c) { echo get_class($c)."\n"; } f(new C); // C f(new D); // D ?>
PHP 的型態:PHP: Type declarations
PHP 強制使用「強型態」的模式
型態已經指定 int、float 了,為何強型態要直接錯誤,而不是繼續執行呢?
下述範例可以參考看看:(範例取自此篇:php 7.2 - What do strict types do in PHP?)
<?php function AddIntAndFloat(int $a, float $b) : int { return $a + $b; } echo AddIntAndFloat(1.4, '2'); // 3 ?>
在上述寫法,執行結果會是 3,而不是 3.4。這種情況更適合「直接錯誤」不要執行 (註:將所有型態 int、float 都拿掉,反而結果是正確的 3.4)。
要如何指定強型態,有錯誤的輸入、輸出直接噴錯誤呢?
PHP 7 之後,只要在程式的最上方宣告下述:
- declare(strict_types = 1);
文件可見:
- PHP: Returning values - Manual
- PHP: New features - Scalar type declarations
- To enable strict mode, a single
declare
directive must be placed at the top of the file
- To enable strict mode, a single
再來程式只要型態不對,就會直接報錯誤,如下述範例:
回傳型態錯誤
<?php declare(strict_types = 1); function sum($a, $b): int { return $a + $b; } var_dump(sum(1, 2)); var_dump(sum(1, 2.5)); ?>
若 strict_types = 0,回傳值如下:
int(3) int(3)
註:第二個原本應該是 float(3.5),回傳值被強制轉成整數回傳,所以變成 3
但是若 strict_types = 1,就會噴下述錯誤:
int(3) PHP Fatal error: Uncaught TypeError: Return value of sum() must be of the type integer, float returned in /tmp/test.php:5 Stack trace: #0 /tmp/test.php(9): sum(1, 2.5) #1 {main} thrown in /tmp/test.php on line 5
傳入型態錯誤
<?php declare(strict_types = 1); function get_string(string $str) { var_dump($str); } get_string(123); ?>
若 strict_types = 0,回傳值如下:
string(3) "123"
但是若 strict_types = 1,就會噴下述錯誤:
PHP Fatal error: Uncaught TypeError: Argument 1 passed to get_string() must be of the type string, integer given, called in /tmp/test.php on line 8 and defined in /tmp/test.php:4 Stack trace: #0 /tmp/test.php(8): get_string(12) #1 {main} thrown in /tmp/test.php on line 4