PHP 類型聲明和強類型聲明


一、類型聲明 及 返回值類型聲明

類型聲明 起始版本 說明
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'); // 報錯

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM