一、類型聲明 及 返回值類型聲明
類型聲明 | 起始版本 | 說明 |
array | 5.1 | 數組,默認值可以是null或數組 |
int | 7.0 | 整數值,默認值可以是null或整數 |
float | 7.0 | 浮點數值(一個帶小數點的數值)。即使開啟了嚴格模式,也可以接受整數。 默認值可以是null、浮點類型或整數 |
callable | 5.4 | 可調用代碼(如匿名函數),默認值可以是null |
bool | 7.0 | 布爾值,默認值可以是null或布爾值 |
string | 5.0 | 字符數據,默認值可以是null或字符串 |
self | 5.0 | 字符數據,指向自己的引用 |
[類類型] | 5.0 | 類或接口的類型,默認值可以是null |
void | 7.1 | 只用於返回值類型聲明,不可用於參數類型聲明,否則報錯 強類型檢查模式下定義返回類型為 void 的方法不能有返回值,即使返回 null 也不行;或者使用一個空的 return 語句 |
使用:
1 class A 2 { 3 /** 4 * 舉個例子 5 * @param {Int} $a 變量$a被聲明為整數 6 * @param {Array} $b 變量$b被聲明為數組 7 * @return {Float} 返回值被聲明為浮點型 8 */ 9 public static function show(int $a, array $b): float 10 { 11 return $a . $b; 12 } 13 }
二、可空類型聲明
可空類型主要用於參數類型聲明和函數返回值聲明
形式分以下兩種:
1 function a(): ?int { 2 return null; //ok 3 } 4 5 function a(): ?int { 6 return 42; // ok 7 } 8 9 function show(?string $msg) { 10 if ($msg) { 11 echo $msg; 12 } 13 }
意思為:所指的就是通過 ? 的形式表明函數參數或者返回值的類型要么為指定類型,要么為 null。
此方法也可用於接口函數的定義:
1 interface A{ 2 function a(?A $f); 3 }
但有一個需要注意的地方:如果函數本身定義了參數類型並且沒有默認值,即使是可空的,也不能省略,否則會觸發錯誤。如下:
1 function a(?Bar $bar) {} 2 3 a(new Bar); // 可行 4 a(null); // 可行 5 a(); // 不可行
但是如果以上函數的參數定義為 ?Bar $bar = null 的形式,則第三種寫法也是可行的。因為 = null 實際上相當於 ? 的超集,對於可空類型的參數,可以設定 null 為默認值。
類函數中對於返回類型的聲明也不能被子類覆蓋,否則會觸發錯誤:
1 class A 2 { 3 public function show(): void { 4 } 5 } 6 7 class B extends A 8 { 9 public function show(): array { 10 // Fatal error: Declaration of Foobar::bar() must be compatible with Foo::bar(): void 11 } 12 }
三、強類型聲明(嚴格校驗模式)
- 默認情況下,所有的PHP文件都處於弱類型校驗模式,弱類型校驗模式下如果參數不符合聲明類型,將會按照php的規則進行轉換。
- 通過指定strict_types的值(1或者0),1表示嚴格類型校驗模式,作用於函數調用和返回語句;0表示弱類型校驗模式。
- declare(strict_types=1)必須是文件的第一個語句。如果這個語句出現在文件的其他地方,將會產生一個編譯錯誤,塊模式是被明確禁止的。
- strict_types指令只影響指定使用的文件,不會影響被它包含(通過include等方式)進來的其他文件。該指令在運行時編譯,不能修改。它的運作方式,是在opcode中設置一個標志位,讓函數調用和返回類型檢查符合類型約束。
以下代碼會被按照php的規則轉換:
1 class A 2 { 3 // 類型聲明$a為布爾型 4 public static function show(bool $a) 5 { 6 var_dump($a); 7 } 8 } 9 // 卻傳入字符型 10 A::show('flase'); // 結果為:boolean true
但如果在文件第一行加上 declare(strict_types=1);
便會開啟嚴格效驗模式
1 <?php 2 declare(strict_types=1); 3 // ... 4 A::show('flase'); // 報錯