PHP7聲明標量類型以及強型別校驗講解

韦小宝
發布: 2023-03-20 17:26:01
原創
5535 人瀏覽過

PHP7早在2015年就已經發布了,使用的人也是越來越多了,這篇文章我們要講的是PHP7如何聲明標量類型以及PHP7如何進行強類型校驗,不了解的同學可以看看哦!

標量類型聲明

#PHP從PHP5.0開始已經有對支援class和interface參數類型聲明,PHP5.1支援array以及PHP5.4支援callable。這些型別宣告讓PHP在執行的時候傳入正確的參數,讓函式簽章有更多的資訊。

從PHP7開始,int、float、string和bool會被辨識為型別聲明,可用於函數傳回值型別和參數型別宣告

<?php
function sum(int $a,int $b):string {
return $a+$b;
}
var_dump(sum(1,2));
登入後複製

執行以上程式碼正常
結果為string(1) "3",在弱型別校驗模式下如果參數不符合宣告類型,將會依照php的規則進行轉換

PHP7.1新增了可空型別的宣告方式並增加了void做為函數傳回值類型,強型別檢查模式下定義回傳類型為void 的函數不能有回傳值,即使回傳null 也不行:

declare(strict_types=1);
function returns_one(): void {
return 1; // Fatal error: A void function must not return a value
}
function returns_null(): void {
return null; // Fatal error: A void function must not return a value
}
登入後複製

此外void 也只適用於傳回類型,並不能用於參數類型聲明,否則會觸發錯誤:

function foobar(void $foo) { 
// Fatal error: void cannot be used as a parameter type
}
登入後複製

可空類型聲明

#可空類型主要用於參數類型聲明和函數傳回值聲明。

主要的兩種形式如下:

function answer(): ?int{
return null; //ok
}function answer(): ?int{
return 42; // ok
}
function say(?string $msg) {
if ($msg) {
echo $msg;
}
}
登入後複製

從例子很容易理解,所指的就是透過? 的形式顯示函數參數或傳回值的型別要不是為指定類型,要么為null。

此方法也可用於介面函數的定義:

interface Fooable {
function foo(?Fooable $f);
}
登入後複製

但有一個需要注意的地方:如果函數本身定義了參數類型且沒有預設值,即使是可空的,也不能省略,否則會觸發錯誤。

如下:

function foo_nullable(?Bar $bar) {}foo_nullable(new Bar); // 可行
foo_nullable(null); // 可行
foo_nullable(); // 不可行
登入後複製

但是如果以上函數的參數定義為 ?Bar $bar = null 的形式,則第三種寫法也是可行的。因為 = null 實際上相當於 ? 的超集,對於可空類型的參數,可以設定 null 為預設值。

類別函數中對於傳回類型的宣告也不能被子類別覆寫,否則會觸發錯誤:

class Foo
{
public function bar(): void {
}
}class Foobar extends Foo
{
public function bar(): array { // Fatal error: Declaration of Foobar::bar() must be compatible with Foo::bar(): void
}
}
登入後複製

嚴格校驗模式
strict_types/declare()指令

#預設情況下,所有的PHP檔案都處於弱類型校驗模式。新的declare指令,透過指定strict_types的值(1或0),1表示嚴格型別校驗模式,作用於函數呼叫與傳回語句;0表示弱型別校驗模式。

declare(strict_types=1)必須是檔案的第一個語句。如果這個語句出現在檔案的其他地方,將會產生一個編譯錯誤,區塊模式是被明確禁止的。

類似於encoding指令,但不同於ticks指令,strict_types指令只影響指定使用的文件,不會影響被它包含(透過include等方式)進來的其他文件。該指令在運行時編譯,不能修改。它的運作方式,是在opcode中設定一個標誌位,讓函數呼叫和傳回類型檢查符合類型約束

<?php
declare(strict_types=1);
function sum(int $a,int $b):string {
return $a+$b;
}
var_dump(sum(1,2));
登入後複製

以上程式碼不符合函數的回傳值類型聲明,將拋出TypeError的錯誤

<?php
declare(strict_types=1);
function sum(string $a,string $b):string {
return $a+$b;
}
var_dump(sum(1,2));
登入後複製

以上程式碼不符合函數的參數型別聲明,也會拋出出錯誤

有一個例外的是,寬泛類型轉換是允許int變成float的,也就是說參數如果被宣告為float類型,但是它仍然可以接受int參數。

<?php
declare(strict_types=1);
function sum(int $a,int $b):float {
return $a+$b;
}
var_dump(sum(1,2));
登入後複製

以上程式碼運行正常

在這種場景下,我們傳遞一個int參數給到定義接受float的函數,這個參數將會被轉換為float。除此之外的轉換,都是不被允許的。

相關推薦:

PHP7.2 版本效能介紹

以上是PHP7聲明標量類型以及強型別校驗講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!