淺談PHP中斷言函數的用法
本篇文章帶大家了解PHP中斷言函數的使用方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
原來一直以為斷言相關的函數是PHPUnit 這些單元測試元件提供的,在閱讀手冊後才發現,這個assert() 斷言函數是PHP 本身就自帶的一個函數。也就是說,我們在程式碼中進行簡單的測試的時候是不需要完全引入整個單元測試組件的。
assert() 斷言函數
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 參數。它包含三個值:
- 1,產生並執行程式碼,一般在測試環境使用
- 0,生成程式碼但是在運行時會路過
- #- 1,不產生程式碼,一般在正式環境使用
這個參數大家可以自行設定測試,預設的php.ini 中它的預設值是1 ,也就是正常的執行assert() 函數。
assert_options() 及相對應的php.ini 中的參數配置
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) | 斷言失敗時呼叫回呼函數
這些參數的意思都非常好理解,大家可以自己測試一下。讓我們就來看看最後一個 ASSERT_CALLBACK 的角色。其實它的說明也非常清楚,就是斷言失敗的情況下就進入這個選項定義的回呼函數。
assert_options(ASSERT_ACTIVE, 1); assert_options(ASSERT_WARNING, 1); assert_options(ASSERT_BAIL, 1); assert_options(ASSERT_CALLBACK, function($params){ echo "====faild====", PHP_EOL; var_dump($params); echo "====faild====", PHP_EOL; }); assert(1!=1); // ====faild==== // string(105) ".../source/一起学习PHP中断言函数的使用.php" // ====faild====
當斷言失敗的時候,我們就進入了回呼函數中,在回呼函數直接簡單的列印了傳給回呼函數的參數內容。可以看出,這個回呼函數裡面傳遞過來的是無法通過斷言的文件資訊。
總結
學習掌握一下斷言函數的使用及配置,可以為我們將來學習PHPUnit 單元測試打下基礎,當然,本身這個能力的東西就不是很多,大家記住就好啦!
测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/202005/source/%E4%B8%80%E8%B5%B7%E5%AD%A6%E4%B9%A0PHP%E4%B8%AD%E6%96%AD%E8%A8%80%E5%87%BD%E6%95%B0%E7%9A%84%E4%BD%BF%E7%94%A8.php
推薦學習:《PHP影片教學》
以上是淺談PHP中斷言函數的用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。
