首頁  >  文章  >  後端開發  >  期待已久的PHP方法參數類型約束它來咯

期待已久的PHP方法參數類型約束它來咯

醉折花枝作酒筹
醉折花枝作酒筹轉載
2021-06-10 17:31:301587瀏覽

本篇文章跟大家介紹一下PHP的方法參數類型限制。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

期待已久的PHP方法參數類型約束它來咯

在之前的文章PHP方法參數的那點事兒中,我們講過關於PHP方法參數的一些小技巧。今天,我們帶來的是更深入的研究一下PHP中方法的參數類型。

在PHP5之後,PHP正式引入了方法參數類型限制。也就是如果指定了方法參數的類型,那麼傳不同類型的參數將會導致錯誤。在PHP手冊中,方法的類型限制僅限於類別、介面、陣列或callable回呼函數。如果指定了預設值為NULL,那麼我們也可以傳遞NULL作為參數。

class A{}
function testA(A $a){
    var_dump($a);
}

testA(new A());
// testA(1); 
// Fatal error: Uncaught TypeError: Argument 1 passed to testA() must be an instance of A, int given,

在這個例子中,我們定義了參數類型為A類,所以當我們傳遞一個標量類型時,直接就會傳回錯誤訊息。

function testB(int $a){
    var_dump($a);
}
testB(1);
testB('52aadfdf'); // 字符串强转为int了
// testB('a');
// Fatal error: Uncaught TypeError: Argument 1 passed to testB() must be of the type int, string given

function testC(string $a){
    var_dump($a);
}
testC('测试');
testC(1);  // 数字会强转为字符串
// testC(new A()); 
// Fatal error: Uncaught TypeError: Argument 1 passed to testC() must be of the type string

在手冊中明確說明了標量類型是不能使用型別約束的。但其實是可以使用的,不過如果都是標量類型則會進行相互的強制轉換,並不能起到很好的約束作用。例如上例中int和string型別進行了相互強制轉換。

指定了非標量類型,則會報錯。這裡是本文的重點,小夥伴們可要劃個線了哦。其實說白了,如果我們想指定參數的類型為固定的標量類型的話,在參數中指定並不是一個好的選擇,最好還是在方法中進行再次的類型判斷。

而且如果參數中進行了強轉,也會導致方法內部的判斷產生偏差。

最後我們再看一看介面和匿名方法的型別約束。匿名參數類型在Laravel等框架中非常常見。

// 接口类型
interface D{}
class childD implements D{}
function testD(D $d){
    var_dump($d);
}
testD(new childD());

// 回调匿名函数类型
function testE(Callable $e, string $data){
    $e($data);
}
testE(function($data){
    var_dump($data);
}, '回调函数');

測試程式碼:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202001/%E5%85%B3%E4%BA%8EPHP%E7%9A%84%E6%96%B9%E6%B3%95%E5%8F%82%E6%95%B0%E7%B1%BB%E5%9E%8B%E7%BA%A6%E6%9D%9F.md

推薦學習:php影片教學

以上是期待已久的PHP方法參數類型約束它來咯的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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