W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
類在方法有契約:
<?php
class A {}
class B extends A {}
function foo(A $a) {}
function bar(B $b) {
foo($b);
}
?>
這段代碼類型安全,因?yàn)?B 遵循 A 的契約,并通過協(xié)變/逆變的邏輯,將會(huì)保留任何對(duì)方法的期望,除了異常。
枚舉在其選項(xiàng)上有契約,而不是方法:
<?php
enum ErrorCode {
case SOMETHING_BROKE;
}
function quux(ErrorCode $errorCode)
{
// When written, this code appears to cover all cases
match ($errorCode) {
ErrorCode::SOMETHING_BROKE => true,
}
}
?>
在函數(shù) quux 中,match 語(yǔ)句可以進(jìn)行靜態(tài)分析,以涵蓋 ErrorCode 中的所有情況。
但是想一下,如果允許擴(kuò)展枚舉:
<?php
// Thought experiment code where enums are not final.
// Note, this won't actually work in PHP.
enum MoreErrorCode extends ErrorCode {
case PEBKAC;
}
function fot(MoreErrorCode $errorCode) {
quux($errorCode);
}
fot(MoreErrorCode::PEBKAC);
?>
根據(jù)正常的繼承規(guī)則,繼承另一個(gè)類的類將通過類型檢查。
問題在于 quux() 中的 match 語(yǔ)句不再涵蓋所有情況。因?yàn)樗恢?nbsp;MoreErrorCode::PEBKAC,所以匹配語(yǔ)句會(huì)拋出異常。
因此,枚舉是 final,不能擴(kuò)展。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: