在本文中,您將了解如何在 php(做為現在的主流開發語言) 中明智地使用函數。在每一種高級編程語言中,程序員都可以定義函數,php(做為現在的主流開發語言) 也不例外。唯一的區別在於,您不必擔心函數的返回類型。
深入研究
函數可用於:
將幾行代碼封裝成一條語句。
簡化代碼。
最重要的是,將應用程序作為更小的應用程序相互協調的產物。
對於從編譯語言(如 C/C++)轉到 php(做為現在的主流開發語言) 的開發人員來說,php(做為現在的主流開發語言) 的性能級別是令人吃驚的。在使用 CPU 和內存資源方面,用戶定義的函數非常昂貴。這主要是因為 php(做為現在的主流開發語言) 是解釋型和松散類型的。
包裝與否
有些開發人員僅僅因為不喜歡函數的名稱就把他們使用的每個函數都包裝起來,而另一些開發人員卻根本不喜歡使用包裝。
包裝現有的 php(做為現在的主流開發語言) 函數而不添加或補充現有的功能,是完全不能接受的。除了會增加大小和執行時間外,這樣的重命名函數有時可能會帶來管理上的惡夢。
代碼中的內聯函數會導致莫名其妙的代碼,甚至是更大的管理災難。這樣做的唯一好處可能就是得到一個更快的代碼。
更明智的方法是,僅在需要多次使用代碼,並且對於您希望實現的任務沒有可用的內置 php(做為現在的主流開發語言) 函數時才定義函數。您可以選擇重命名或僅當需要時才有限制地使用。
圖 1 中的圖表粗略地顯示了可管理性和速度與使用的函數數量之間的相互關系。(在此我沒標明單位,因為數字取決於個體和團隊的能力;這一關系是重要的可視數據。)
圖 1. 可管理性/速度 Vs. 函數數量 命名函數
正如我在本系列文章的第" 2 部分(請參閱參考資料)中提到的,要獲得有效的代碼管理,始終都使用公共的命名約定是必不可少的。
其它兩個需要考慮的實踐是:
選擇的名稱應當能很好地提示函數的功能。
使用表明包或模塊的前綴。
假定您有一個名為 user 的模塊,它包含用戶管理函數,那麼對於檢查用戶當前是否在線的函數而言,諸如 usr_is_online() 和 usrIsOnline() 這樣的函數名稱都是上佳之選。
將上面的名稱與 is_online_checker() 這樣的函數名稱相比較。得到的結論是,使用動詞優於使用名詞,因為函數始終都會做點什麼。
多少參數? 很有可能您將使用已經構造的函數。即使情形並非如此,您可能也希望最大化代碼的使用范圍。要做到這一點,您和其他開發人員應當繼續開發易於使用的函數。沒人喜歡使用那些所帶的參數既晦澀又難於理解的函數,因此請編寫易於使用的函數。
選擇一個能夠說明函數用途的名稱(並減少函數使用的參數數量)是確保易於使用的一個好方法。參數數量的幻數是什麼呢?依我看來,超過三個參數就會使函數難以記憶。使用大量參數的復雜函數幾乎都能被拆分成多個更簡單的函數。
沒人喜歡使用湊合的函數。
編寫優質函數 假定您希望在將 HTML 文檔放到浏覽器之前設置文檔的標題。標題就是 <head>...</head> 標記之間的所有內容。
假定您希望設置 title 和 meta 標記。不使用 setHeader(title, name, value) 函數執行所有工作,而分別使用 setTitle(title) 和 setMeta(name, value) 完成各項工作是一個更佳的解決方案。該方案相互獨立地設置 title 和 meta標記。
進一步考慮,標題可以只包含一個 title 標記,但它可以包含多個 meta 標記。如果需要設置多個 meta 標記,則代碼必須多次調用 setMeta()。在這種情況下,更佳的解決方案是將帶有名稱-值對的兩維數組傳遞給 setMeta(),並且讓函數循環執行該數組 — 同時執行所有操作。
一般來說,象這樣的同時的函數更可取。用函數需要處理的所有數據一次性調用函數,始終優於多次調用函數,並以增量的方式為其提供數據。編寫函數時的主要思想是,盡量減少從其它代碼對其的調用。