確保 PHP 中結(jié)構(gòu)良好的 Switch 命令
在 PHP 中,switch
語句是控制程序流程的強(qiáng)大工具,尤其是在處理多個(gè)條件分支時(shí)。然而,實(shí)現(xiàn)干凈高效的轉(zhuǎn)換也有其自身的障礙。這篇文章探討了檢查“switch”命令質(zhì)量的基本技巧和實(shí)踐,以確保代碼質(zhì)量并優(yōu)化其性能。
缺少默認(rèn)條目
首先要考慮的是該switch
聲明是否包含default
案例。Adefault
充當(dāng)后備選項(xiàng),確保在沒有定義的case
匹配項(xiàng)時(shí)執(zhí)行代碼。
default
應(yīng)始終存在。事實(shí)上,命令match
是 的替代版本switch
,當(dāng)它無法匹配任何case
, 并且default
缺少 時(shí),它會(huì)引發(fā)異常。
<?php switch($a) { case 0: echo 'A'; break; case 1: echo 'A'; break; } ?>
登錄后復(fù)制
default
服務(wù)于不同的目的:
- 將所有其他情況一并處理。這是當(dāng)有限的案例列表可用時(shí),并且該列表之外的任何事情都可以以單一方式處理。
- 如果達(dá)到則引發(fā)錯(cuò)誤。在這種情況下,前面的上下文
switch
可確保處理有限的案例列表。然后,每當(dāng)合法的情況之外的情況到達(dá)命令時(shí),就應(yīng)該引發(fā)異常。<?php switch($a) { case 0: echo 'A'; break; case 1: echo 'A'; break; default: throw new MyException('This should be zero or one'); } ?>
登錄后復(fù)制
始終確保交換機(jī)有默認(rèn)值。
重復(fù)案例
檢查
switch
陳述中是否有重復(fù)案例是有回報(bào)的。PHP 只處理它遇到的第一種情況,忽略其他情況。這會(huì)導(dǎo)致死代碼,開關(guān)中的一些分支將被忽略并且永遠(yuǎn)不會(huì)被使用。<?php switch($a) { case 'gif': // doSomething() and break case 'jpeg': case 'jpg': // doSomething() and break case 'png': // doSomething() and break case 'gif': // doSomething() and break default: throw new MyException('This should be an image format'); } ?>
登錄后復(fù)制
重復(fù)的情況經(jīng)常發(fā)生在很長的案例列表中。
當(dāng)實(shí)際值被常量名稱或 PHP 的類型雜耍隱藏時(shí),也會(huì)發(fā)生這種情況。確實(shí),
switch
使用了寬松的比較風(fēng)格,有些文字實(shí)際上可能是相同的。<?php // $a in [null, false, '', 0] switch($a) { // Most of the cases ends here, except 0 // because it is the first encountered case '': print 'Empty string';break; // 0 goes here case 0: print 'Zero';break; case false: print 'false';break; case null: print 'null';break; default: throw new MyException('This should be empty'); } ?>
登錄后復(fù)制
仔細(xì)檢查案例值并刪除重復(fù)項(xiàng)。
重復(fù)的代碼塊
另一個(gè)常見問題是不同 case 分支中的代碼塊重復(fù)。這種冗余會(huì)使您的系統(tǒng)變得臃腫
switch
,并且使將來的更新變得困難。考慮重構(gòu)代碼以消除重復(fù)并合并案例。<?php switch($a) { case 'john': $b = 0; break; case 'henry': $b = 10; break; // duplicate of case 'john' case 'julia': $b = 0; break; case 'jeroen': $b = 30; break; default: throw new MyException('This is an unexpected name'); } ?>
登錄后復(fù)制
枚舉案例的使用
PHP 內(nèi)置了對(duì)枚舉的支持。枚舉的重要優(yōu)點(diǎn)之一是其有限性。它們代表選項(xiàng)的完整集合,并且不存在其他選項(xiàng)。這使得檢查 a 是否
switch
涵蓋了所有可能的情況變得很容易。<?php enum formats { case GIF; case JPG; case PNG; } switch($a) { case formats::GIF: // doSomething() and break; case formats::PNG: // doSomething() and break; // We are missing one case : JPG! // Unknown cases triggers an exception lazily (only if reached) case formats::TIFF: // doSomething() and break; default: throw new MyException('Unknown image format'); } ?>
登錄后復(fù)制
通過簡(jiǎn)單開關(guān)進(jìn)行優(yōu)化
PHP 7.2 引入了針對(duì)
switch
.在此之前,PHP 會(huì)逐個(gè)檢查每個(gè)案例,并在找到匹配值后立即停止。在 PHP 7.2 及更高版本中,當(dāng)大小寫值是簡(jiǎn)單文字時(shí),PHP 會(huì)為它們?cè)O(shè)置一個(gè)查找表。然后,PHP 立即跳轉(zhuǎn)到正確的情況,并繞過所有其他不匹配的情況。
<?php switch($a) { case 1: // doSomething() and break; case 2: // doSomething() and break; default: throw new MyException('Unknown image format'); } ?>
登錄后復(fù)制
當(dāng)所有情況都是簡(jiǎn)單值時(shí),就會(huì)發(fā)生簡(jiǎn)單切換,可以直接與傳入變量進(jìn)行比較。
如果開關(guān)混合了表達(dá)式和簡(jiǎn)單值,建議將簡(jiǎn)單文字放在第一個(gè)開關(guān)中
switch
,并將其他文字放在第二個(gè)開關(guān)中。<?php switch($a) { case 1: // doSomething() and break; case 2: // doSomething() and break; default: switch($a) { case $b + 2: // doSomething() and break; case strtolower($a): // doSomething() and break; default: throw new MyException('Unknown case'); } } ?>
登錄后復(fù)制
以不同的方式處理它們也可能更方便,例如使用先前的條件。
總結(jié)
總之,
switch
PHP 中結(jié)構(gòu)良好的語句可以極大地提高代碼的清晰度、可維護(hù)性和性能。通過檢查缺失的默認(rèn)條目、消除重復(fù)的情況和代碼塊、利用類似枚舉的結(jié)構(gòu)以及優(yōu)化復(fù)雜的開關(guān),您可以確保您的語句仍然是switch
任何 PHP 代碼庫的高效且有效的部分。以上就是PHP中實(shí)用的開關(guān)命令的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注www.92cms.cn其它相關(guān)文章!