關(guān)于PHP的方法參數(shù)類型約束

在之前的文章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://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

參考文檔:
https://www.php.net/manual/zh/language.oop5.typehinting.php

===========

各自媒體平臺(tái)均可搜索【硬核項(xiàng)目經(jīng)理】

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末污朽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子龙考,更是在濱河造成了極大的恐慌蟆肆,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晦款,死亡現(xiàn)場離奇詭異炎功,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)缓溅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門蛇损,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坛怪,你說我怎么就攤上這事淤齐。” “怎么了袜匿?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵床玻,是天一觀的道長。 經(jīng)常有香客問我沉帮,道長锈死,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任穆壕,我火速辦了婚禮待牵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘喇勋。我一直安慰自己缨该,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布川背。 她就那樣靜靜地躺著贰拿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熄云。 梳的紋絲不亂的頭發(fā)上膨更,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音缴允,去河邊找鬼荚守。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的矗漾。 我是一名探鬼主播锈候,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼敞贡!你這毒婦竟也來了泵琳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤誊役,失蹤者是張志新(化名)和其女友劉穎虑稼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體势木,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛛倦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了啦桌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溯壶。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖甫男,靈堂內(nèi)的尸體忽然破棺而出且改,到底是詐尸還是另有隱情,我是刑警寧澤板驳,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布又跛,位于F島的核電站,受9級(jí)特大地震影響若治,放射性物質(zhì)發(fā)生泄漏慨蓝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一端幼、第九天 我趴在偏房一處隱蔽的房頂上張望礼烈。 院中可真熱鬧,春花似錦婆跑、人聲如沸此熬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽犀忱。三九已至,卻和暖如春扶关,著一層夾襖步出監(jiān)牢的瞬間阴汇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國打工驮审, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鲫寄,地道東北人吉执。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓疯淫,卻偏偏與公主長得像地来,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子熙掺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容