我一直是 Rust 和 GoLang 的忠實粉絲。他們的程式設計方法,特別是錯誤處理方法,在我的整個職業生涯中引起了我的共鳴。在致力於 GoLang 開發四年多之後,我最近轉向了一個項目,將遺留的 PHP 程式碼重構為更新、更強大的版本。這種轉變既令人興奮又充滿挑戰,特別是在適應 PHP 傳統的錯誤處理機制方面。
已經習慣了 Go 的「錯誤即值」概念,切換回依賴傳統 try-catch 範例的語言是一個重大調整。透過例外來期待意外的想法感覺違反直覺。在 GoLang 中,錯誤被視為函數可以產生的明確傳回值,需要開發人員直接處理它們。這種明確性提高了清晰度,並鼓勵在每個函數呼叫時進行徹底的錯誤檢查。
相反,基於異常的錯誤處理有時會導致被忽略的邊緣情況。可以呼叫一個拋出異常的函數,並且只有當應用程式崩潰時才發現生產中的疏忽,這是每個開發人員都希望避免的情況。
為了應對這項挑戰,我決定在我的 PHP 控制器方法中引入受 Rust 啟發的結果類型。 Rust 的錯誤處理方法與 Go 的非常相似,強調傳回明確指示成功或失敗的結果。透過在 PHP 中實現 Result 類型,我的目標是為我目前的專案帶來這種程度的明確性和安全性。
例如,在使用者註冊端點中,我包裝了 Laravel 的驗證器以傳回包含有效值或錯誤的結果。此修改允許我明確處理驗證失敗,使應用程式能夠在適當的時候返回 422 Unprocessable Entity 狀態代碼。這不僅使錯誤處理更加透明,而且還透過確保正確考慮和管理所有潛在錯誤來提高 API 的可靠性。
以下是我從這個方法中觀察到的一些主要好處:
為了更清楚地了解這種方法,我準備了三個程式碼範例來突出顯示語言之間的對比和相似之處,並展示採用某些模式如何能夠產生更健壯和可維護的程式碼。
我很想聽聽您對這種方法的想法。您認為將一種語言的概念融入另一種語言是否在長期內有益?
歡迎分享您的經驗或提出任何問題。
以上是PHP 中的 Result