2010-05-11 61 views
4

我使用異常拋出函數在php中的類中檢查參數。我有一些基本檢查功能(===,in_array等),並在false上拋出異常。所以我可以做assertNumeric($argument, "\$argument is not numeric.");代替使用斷言在php中進行類型檢查?

if (! is_numeric($argument)) { 
    throw new Exception("\$argument is not numeric."); 
} 

節省一些打字

我在php manual page on assert()

正如維基百科指出的評論閱讀 - 「斷言 主要開發工具,他們 往往是當一個程序是 向公衆發佈時被禁用。「以及 「斷言應該用來記錄 邏輯上是不可能的情況下和 發現編程錯誤 - 如果 ‘不可能’發生,那麼就有 基本顯然是錯誤的這是 從錯誤處理不同:最 錯誤情況是可能的, 。 雖然有些人可能會非常 不可能在實踐中出現使用 斷言通用錯誤 處理機制通常是不明智的: 斷言不允許從錯誤中優美 恢復,並斷言 故障往往會停止程序的 執行突然間。斷言還做 不顯示用戶友好的錯誤 消息。」

這意味着, 給出的建議‘GK在proliberty點com’給力 斷言啓用,即使 他們已手動禁用,去 只針對使用 他們作爲開發工具

所以最佳實踐,我在「做錯了」?還有什麼其他/更好的這樣做的方法有哪些?

+1

正如旁註:你想用這種方式驗證用戶輸入嗎?如果是這樣的話,我認爲無效的用戶輸入是不尋常的。 – Maxem 2010-05-11 19:47:02

+0

@Maxem好吧,如果我沒有健壯地編寫代碼,可能會發生這種情況。基本上我正在做的是如果參數不好,渲染對象顯然是無用的。我喜歡KISS哲學。 – user151841 2010-05-11 19:50:37

+1

如果您的用戶輸入驗證器失敗並進一步下載到庫中,那麼*會是什麼樣的例外,他們確實希望理智的輸入和瘋狂的東西。 * *表示例外。測試將被稱爲健康檢查。 – 2010-08-27 17:22:03

回答

1

就個人而言,我會維護維基百科的內容,而不是使用斷言進行常規類型檢查。我會使用PHP Type-Hinting(目前工作在PHP 5.1和php 5.2的數組中)不會幫助你處理基本的數據類型,但它總比沒有好。然後你可以使用你暗示的功能,甚至可以進一步研究一下,並考慮Ilia Alshanetsky的一般類型提示補丁。 See here

+0

我不知道。我的意思是,鍵入提示數組和對象是好的,但如果類真的需要一個整數或一個非空字符串,斷言是皺眉?我不能安裝類型提示補丁。我是否應該繼續做我正在做的事情,而不是稱它爲斷言? – user151841 2010-05-12 14:06:17

+0

斷言僅適用於調試和開發環境! – 2010-08-27 17:23:34

0

與常規斷言一樣,您應該可以通過常規或變量或類構造函數方法將您的自定義斷言關閉。它們實際上不屬於(活動的)生產代碼,或者默認情況下在任何類型的庫中都是活動的。對於你正在使用它們做什麼來說,即使你可以關閉它們,它似乎也浪費了CPU週期。

在較低級別的語言中,斷言對於捕捉非常奇怪的情況非常有用,例如由過度熱心的體系結構特定的編譯器優化創建的錯誤。例如,你知道在任何理智的宇宙中,斷言的條件將是真實的。然後你的編譯器撕開空間時間結構,一切都變了。所以,如果您使用PHC或Roadsend之類的軟件編譯您的應用程序,它們可能會很有用。

我也看到了'過於安全'的代碼(大部分是C),其中每個函數的入口都被斷言所保護。我真的質疑這樣做的智慧。

總之,你想要你的代碼優雅地失敗或根本不失敗,而不僅僅是停止,特別是如果它取決於用戶輸入。斷言只報告評估爲false的條件,他們不會處理錯誤。

+0

爲什麼你不在生產代碼中使用它們?如果你必須檢查一些東西,反正你會使用CPU週期。如果您將assert()用於絕對不應該發生的事情而不是if檢查,那麼性能會受到多大影響? – markus 2013-01-18 20:31:37