在之前的文章PHP方法參數(shù)的那點(diǎn)事兒中寺庄,我們講過關(guān)于PHP方法參數(shù)的一些小技巧。今天裁赠,我們帶來的是更加深入的研究一下PHP中方法的參數(shù)類型辩恼。
在PHP5之后选侨,PHP正式引入了方法參數(shù)類型約束锐想。也就是如果指定了方法參數(shù)的類型,那么傳不同類型的參數(shù)將會(huì)導(dǎo)致錯(cuò)誤旺订。在PHP手冊(cè)中弄企,方法的類型約束僅限于類、接口区拳、數(shù)組或者callable回調(diào)函數(shù)拘领。如果指定了默認(rèn)值為NULL,那么我們也可以傳遞NULL作為參數(shù)樱调。
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,
在這個(gè)例子中约素,我們定義了參數(shù)類型為A類,所以當(dāng)我們傳遞一個(gè)標(biāo)量類型時(shí)笆凌,直接就會(huì)返回錯(cuò)誤信息圣猎。
function testB(int $a){
var_dump($a);
}
testB(1);
testB('52aadfdf'); // 字符串強(qiáng)轉(zhuǎn)為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); // 數(shù)字會(huì)強(qiáng)轉(zhuǎn)為字符串
// testC(new A());
// Fatal error: Uncaught TypeError: Argument 1 passed to testC() must be of the type string
在手冊(cè)中明確說明了標(biāo)量類型是不能使用類型約束的。但其實(shí)是可以使用的乞而,不過如果都是標(biāo)量類型則會(huì)進(jìn)行相互的強(qiáng)制轉(zhuǎn)換送悔,并不能起到很好的約束作用。比如上例中int和string類型進(jìn)行了相互強(qiáng)制轉(zhuǎn)換晦闰。指定了非標(biāo)量類型放祟,則會(huì)報(bào)錯(cuò)鳍怨。此處是本文的重點(diǎn)呻右,小伙伴們可要?jiǎng)潅€(gè)線了哦。其實(shí)說白了鞋喇,如果我們想指定參數(shù)的類型為固定的標(biāo)量類型的話声滥,在參數(shù)中指定并不是一個(gè)好的選擇,最好還是在方法中進(jìn)行再次的類型判斷。而且如果參數(shù)中進(jìn)行了強(qiáng)轉(zhuǎn)落塑,也會(huì)導(dǎo)致方法內(nèi)部的判斷產(chǎn)生偏差纽疟。
最后我們?cè)倏匆豢唇涌诤湍涿椒ǖ念愋图s束。匿名參數(shù)類型在Laravel等框架中非常常見憾赁。
// 接口類型
interface D{}
class childD implements D{}
function testD(D $d){
var_dump($d);
}
testD(new childD());
// 回調(diào)匿名函數(shù)類型
function testE(Callable $e, string $data){
$e($data);
}
testE(function($data){
var_dump($data);
}, '回調(diào)函數(shù)');
參考文檔:
https://www.php.net/manual/zh/language.oop5.typehinting.php
===========
各自媒體平臺(tái)均可搜索【硬核項(xiàng)目經(jīng)理】