確保 PHP 中結構良好的 Switch 命令
在 PHP 中,switch
語句是控制程序流程的強大工具,尤其是在處理多個條件分支時。然而,實現干凈高效的轉換也有其自身的障礙。這篇文章探討了檢查“switch”命令質量的基本技巧和實踐,以確保代碼質量并優化其性能。
缺少默認條目
首先要考慮的是該switch
聲明是否包含default
案例。Adefault
充當后備選項,確保在沒有定義的case
匹配項時執行代碼。
default
應始終存在。事實上,命令match
是 的替代版本switch
,當它無法匹配任何case
, 并且default
缺少 時,它會引發異常。
<?php switch($a) { case 0: echo 'A'; break; case 1: echo 'A'; break; } ?>
登錄后復制
default
服務于不同的目的:
- 將所有其他情況一并處理。這是當有限的案例列表可用時,并且該列表之外的任何事情都可以以單一方式處理。
- 如果達到則引發錯誤。在這種情況下,前面的上下文
switch
可確保處理有限的案例列表。然后,每當合法的情況之外的情況到達命令時,就應該引發異常。<?php switch($a) { case 0: echo 'A'; break; case 1: echo 'A'; break; default: throw new MyException('This should be zero or one'); } ?>
登錄后復制
始終確保交換機有默認值。
重復案例
檢查
switch
陳述中是否有重復案例是有回報的。PHP 只處理它遇到的第一種情況,忽略其他情況。這會導致死代碼,開關中的一些分支將被忽略并且永遠不會被使用。<?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'); } ?>
登錄后復制
重復的情況經常發生在很長的案例列表中。
當實際值被常量名稱或 PHP 的類型雜耍隱藏時,也會發生這種情況。確實,
switch
使用了寬松的比較風格,有些文字實際上可能是相同的。<?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'); } ?>
登錄后復制
仔細檢查案例值并刪除重復項。
重復的代碼塊
另一個常見問題是不同 case 分支中的代碼塊重復。這種冗余會使您的系統變得臃腫
switch
,并且使將來的更新變得困難。考慮重構代碼以消除重復并合并案例。<?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'); } ?>
登錄后復制
枚舉案例的使用
PHP 內置了對枚舉的支持。枚舉的重要優點之一是其有限性。它們代表選項的完整集合,并且不存在其他選項。這使得檢查 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'); } ?>
登錄后復制
通過簡單開關進行優化
PHP 7.2 引入了針對
switch
.在此之前,PHP 會逐個檢查每個案例,并在找到匹配值后立即停止。在 PHP 7.2 及更高版本中,當大小寫值是簡單文字時,PHP 會為它們設置一個查找表。然后,PHP 立即跳轉到正確的情況,并繞過所有其他不匹配的情況。
<?php switch($a) { case 1: // doSomething() and break; case 2: // doSomething() and break; default: throw new MyException('Unknown image format'); } ?>
登錄后復制
當所有情況都是簡單值時,就會發生簡單切換,可以直接與傳入變量進行比較。
如果開關混合了表達式和簡單值,建議將簡單文字放在第一個開關中
switch
,并將其他文字放在第二個開關中。<?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'); } } ?>
登錄后復制
以不同的方式處理它們也可能更方便,例如使用先前的條件。
總結
總之,
switch
PHP 中結構良好的語句可以極大地提高代碼的清晰度、可維護性和性能。通過檢查缺失的默認條目、消除重復的情況和代碼塊、利用類似枚舉的結構以及優化復雜的開關,您可以確保您的語句仍然是switch
任何 PHP 代碼庫的高效且有效的部分。以上就是PHP中實用的開關命令的詳細內容,更多請關注www.92cms.cn其它相關文章!