首頁  >  文章  >  後端開發  >  PHP7+也支援型別聲明了,聊聊這個特性吧!

PHP7+也支援型別聲明了,聊聊這個特性吧!

青灯夜游
青灯夜游轉載
2022-05-07 21:22:414635瀏覽

PHP也開始搞類型聲明,PHP7 增加了類型聲明的特性,以下這篇文章就來帶大家了解一下PHP類型聲明特性,分享一下在返回類型聲明踩的坑,希望對大家有所幫助!

PHP7+也支援型別聲明了,聊聊這個特性吧!

最近在研究PHP7的新特性,發現PHP也開始搞類型宣告了,這麼做的好處很明顯:能提高程式運作速度。

下面開始介紹這個新特性:

預設情況下,所有的PHP檔案都處於弱型別校驗模式。

PHP7 增加了類型宣告的特性,型別宣告有兩種模式:

  • 強制模式(預設模式) 我的理解就是強制轉換成需要的類型,不嚴格區分類型而是強轉,類型不一致不報錯誤
  • 嚴格模式嚴格校驗類型,類型與宣告的不一致,報錯

#標量類型宣告語法格式:

declare(strict_types=1);

其中strict_types的值:

  • 1表示嚴格型別校驗模式,作用於函式呼叫與傳回語句;
  • 0表示弱型別校驗模式

可以使用的型別參數有:

  • string
  • int
  • float
  • bool
  • interfaces
  • array
  • #callable

強制模式(預設模式)

<?php

function sum(int ...$ints)
{
   return array_sum($ints);
}

print(sum(1, &#39;2&#39;, 3.1));
?>

以上程式執行輸出結果為:6

#分析即:將字串型別的'2'轉換成整數型的2 ,將float類型的3.1轉換為整型的3後再相加,得到結果6。

嚴格模式

<?php

declare(strict_types=1);

function sum(int ...$ints)
{
   return array_sum($ints);
}

print(sum(1, &#39;2&#39;, 3.1));
?>

以上程式因為採用了嚴格模式,因為第二個參數不是int類型,執行結果報錯如下:

PHP Fatal error:  Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, called in……

#傳回類型宣告

PHP7 增加了對傳回類型宣告的支持,傳回型別宣告指明了函數傳回值的型別。

可以宣告的傳回型別有:

string

int

float

bool

interfaces

array

callable################我踩到的坑###########這裡我還真趟過坑,在新版本的phpstorm中會根據回傳值類型出現提示程式碼,引導新增回傳類型聲明,我就加上了。但後面因為業務的變化或程式碼優化只修改了回傳值(例如之前回傳的是array,修改後回傳了int),卻忘了修改回傳類型聲明(畢竟習慣了PHP弱語言型別這麼多年了... ),這樣是會拋出異常導致報錯的,這就是我踩到的坑,小夥們在使用過程中要注意。 ############思考###############GO語言是不會出現我上面說的問題的, 因為如果返回值類型和返回類型聲明是編譯不通過的,編譯的時候就會報錯。 ############而PHP作為弱型別語言,雖然做了返回類型宣告這種最佳化,但是語言執行前不需要我們編譯,直接發布運行,也就不能做到go語言的「編譯警報」了,PHP會在執行的時候直接拋出異常。 ######
<?php
declare(strict_types=1);

function returnIntValue(int $value): int
{
   return $value;
}

print(returnIntValue(5));
?>
###以上程式執行輸出結果為:###5################傳回型別宣告錯誤範例#########
<?php
declare(strict_types=1);

function returnIntValue(int $value): int
{
   return $value + 3.0;
}

print(returnIntValue(1));
?>
###以上程式由於採用了嚴格模式,回傳值必須是int,但是計算結果是float,導致報錯,執行輸出結果為:###Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned...###############void 函數###############注意:定義傳回型別為void 的函數不能有回傳值,即使回傳null 也不行。 #########傳回值宣告為 void 類型的方法要麼乾脆省去 return 語句,要麼使用一個空的 return 語句。 #########實例######
<?php
function exchange(&$left, &$right) : void
{
    if ($left === $right) {
        return;
    }

    $tmp = $left;
    $left = $right;
    $right = $tmp;
}

$a = 1;
$b = 2;
var_dump(exchange($a, $b), $a, $b);
###以上實例輸出結果:#########null int(2) int(1)####### #####原文網址:https://juejin.cn/post/7062942459247984648######作者:王中陽Go##########推薦學習:《###PHP影片教學## #》###

以上是PHP7+也支援型別聲明了,聊聊這個特性吧!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除