本篇文章要介紹一下使用PHP中斷言函數的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
原來一直以為斷言相關的函數是PHPUnit 這些單元測試元件提供的,在閱讀手冊後才發現,這個assert() 斷言函數是PHP 本身就自帶的一個函數。也就是說,我們在程式碼中進行簡單的測試的時候是不需要完全引入整個單元測試組件的。
assert(1==1); assert(1==2); // assert.exception = 0 时,Warning: assert(): assert(1 == 2) // assert.exception = 1 时,Fatal error: Uncaught AssertionError: 验证不通过
很明顯,第二段程式碼無法透過斷言驗證。這時,PHP 就會回傳一個警告或異常錯誤。為什麼有可能是兩種錯誤形式呢?當我們設定 php.ini 中的 assert.exception 為 off 或 0 時,也就是關閉這個參數的能力時,程式就會以 PHP5 的形式依然傳回一個警告,就像上面程式碼中的註解一樣。
同時,透過 try...catch 也無法進行異常的捕捉了。這個參數其實就是控制是否以正宗的異常物件進行拋出。如果保持這個參數為預設情況也就是設定為 on 或 1 的話,就會直接拋出異常,程式中止。
從上述程式碼可以看出,斷言的第一個參數是一個表達式,而且是需要一個傳回 bool 類型物件的表達式。如果我們傳遞的是一個字串或數字呢?
// 设置 assert.exception = 0 进行多条测试 assert(" "); // Deprecated: assert(): Calling assert() with a string argument is deprecated // Warning: assert(): Assertion " " failed assert("1"); // Deprecated: assert(): Calling assert() with a string argument is deprecated assert(0); // Warning: assert(): assert(0) failed assert(1); assert("1==2"); // Deprecated: assert(): Calling assert() with a string argument is deprecated // Warning: assert(): Assertion "1==2" failed
很明顯第一個參數的表達式會進行類型強制轉換,但是字串類型會多出一個過時提醒,表示給assert() 函數傳遞字串類型的表達式類型已經過時了。目前的測試版本是 7.3 ,在將來可能就會直接報中止運行的錯誤或異常了。
主要問題在於,如果傳遞的字串本身也是一個表達式的話,會以這個表達式的內容為基礎進行判斷,這樣很容易產生歧義,就像最後一段程式碼一樣。當然,已經過時的使用方式還是不建議的,這裡僅是做一個了解即可。
接下來我們來看看assert() 函數的其他參數,它的第二個參數是兩種類型,要麼給一個字串用來定義錯誤的訊息,要麼給一個異常類別用於拋出異常。
assert(1==1, "验证不通过"); assert(1==2, "验证不通过"); // Warning: assert(): 验证不通过 failed
如果直接給的一個字串,那麼在警告的提示訊息中,顯示的就是我們定義的這個錯誤訊息的內容。這個非常好理解。
// 注意 assert.exception 设置不同的区别 assert(1==1, new Exception("验证不通过")); assert(1==2, new Exception("验证不通过")); // assert.exception = 1 时,Fatal error: Uncaught Exception: 验证不通过 // assert.exception = 0 时,Warning: assert(): Exception: 验证不通过
當然,我們也可以給一個 例外類別 讓斷言拋出一個例外。在預設情況下,這個異常的拋出將中止程式的運作。也就是一個正常的異常拋出流程,我們可以使用 try...catch 進行異常的捕捉。
try{ assert(1==2, new Exception("验证不通过")); }catch(Exception $e){ echo "验证失败!:", $e->getMessage(), PHP_EOL; } // 验证失败!:验证不通过
另外還有一個參數會對斷言的整體運行產生影響,那就是 php.ini 中的 zend.assertions 參數。它包含三個值:
這個參數大家可以自行設定測試,預設的php.ini 中它的預設值是1 ,也就是正常的執行assert() 函數。
PHP 中的斷言功能也為我們提供了一個assert_options() 函數,用於方便地設定和獲取一些和斷言能力有關的參數配置。它能夠設定的斷言標誌包括:
標誌| INI設定| 預設值| 描述
ASSERT_ACTIVE | #assert.active | 1 | 啟用assert() 斷言 |
ASSERT_WARNING | assert.warning | # 1 | 為每個失敗的斷言產生一個PHP 警告(warning) |
#ASSERT_BAIL | assert.bail | #0 | 在斷言失敗時中止執行 |
ASSERT_QUIET_EVAL | assert.quiet_eval | 0 | #在斷言表達式求值時停用error_reporting |
ASSERT_CALLBACK | #assert.callback | ##(NULL)斷言失敗時呼叫回呼函數 |