PHP也開始搞類型聲明,PHP7 增加了類型聲明的特性,以下這篇文章就來帶大家了解一下PHP類型聲明特性,分享一下在返回類型聲明踩的坑,希望對大家有所幫助!
最近在研究PHP7的新特性,發現PHP也開始搞類型宣告了,這麼做的好處很明顯:能提高程式運作速度。
下面開始介紹這個新特性:
預設情況下,所有的PHP檔案都處於弱型別校驗模式。
PHP7 增加了類型宣告的特性,型別宣告有兩種模式:
#標量類型宣告語法格式:
declare(strict_types=1);
其中strict_types的值:
可以使用的型別參數有:
強制模式(預設模式)
<?php function sum(int ...$ints) { return array_sum($ints); } print(sum(1, '2', 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, '2', 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
interfacescallable################我踩到的坑###########這裡我還真趟過坑,在新版本的phpstorm中會根據回傳值類型出現提示程式碼,引導新增回傳類型聲明,我就加上了。但後面因為業務的變化或程式碼優化只修改了回傳值(例如之前回傳的是array,修改後回傳了int),卻忘了修改回傳類型聲明(畢竟習慣了PHP弱語言型別這麼多年了... ),這樣是會拋出異常導致報錯的,這就是我踩到的坑,小夥們在使用過程中要注意。 ############思考###############GO語言是不會出現我上面說的問題的, 因為如果返回值類型和返回類型聲明是編譯不通過的,編譯的時候就會報錯。 ############而PHP作為弱型別語言,雖然做了返回類型宣告這種最佳化,但是語言執行前不需要我們編譯,直接發布運行,也就不能做到go語言的「編譯警報」了,PHP會在執行的時候直接拋出異常。 ######float
bool
<?php declare(strict_types=1); function returnIntValue(int $value): int { return $value; } print(returnIntValue(5)); ?>
<?php declare(strict_types=1); function returnIntValue(int $value): int { return $value + 3.0; } print(returnIntValue(1)); ?>
<?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);
以上是PHP7+也支援型別聲明了,聊聊這個特性吧!的詳細內容。更多資訊請關注PHP中文網其他相關文章!