PHP中斷言函數(shù)的使用詳解
原來一直以為斷言相關(guān)的函數(shù)是 PHPUnit 這些單元測試組件提供的,在閱讀手冊后才發(fā)現(xiàn),這個 assert() 斷言函數(shù)是 PHP 本身就自帶的一個函數(shù)。也就是說,我們在代碼中進(jìn)行簡單的測試的時候是不需要完全引入整個單元測試組件的。
assert() 斷言函數(shù)
assert(1==1); assert(1==2); // assert.exception = 0 時,Warning: assert(): assert(1 == 2) // assert.exception = 1 時,F(xiàn)atal error: Uncaught AssertionError: 驗證不通過
很明顯,第二段代碼無法通過斷言驗證。這時,PHP 就會返回一個警告或者異常錯誤。為什么有可能是兩種錯誤形式呢?當(dāng)我們設(shè)置 php.ini 中的 assert.exception 為 off 或者 0 時,也就是關(guān)閉這個參數(shù)的能力時,程序就會以 PHP5 的形式依然返回一個警告,就像上面代碼中的注釋一樣。同時,通過 try...catch 也無法進(jìn)行異常的捕獲了。這個參數(shù)其實就是控制是否以正宗的異常對象進(jìn)行拋出。如果保持這個參數(shù)為默認(rèn)情況也就是設(shè)置為 on 或者 1 的話,就會直接拋出異常,程序中止。
從上述代碼可以看出,斷言的第一個參數(shù)是一個表達(dá)式,而且是需要一個返回 bool 類型對象的表達(dá)式。如果我們傳遞的是一個字符串或者一個數(shù)字呢?
// 設(shè)置 assert.exception = 0 進(jìn)行多條測試 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
很明顯第一個參數(shù)的表達(dá)式會進(jìn)行類型強制轉(zhuǎn)換,但是字符串類型會多出一個過時提醒,表明給 assert() 函數(shù)傳遞字符串類型的表達(dá)式類型已經(jīng)過時了。當(dāng)前的測試版本是 7.3 ,在將來可能就會直接報中止運行的錯誤或異常了。主要問題在于,如果傳遞的字符串本身也是一個表達(dá)式的話,會以這個表達(dá)式的內(nèi)容為基礎(chǔ)進(jìn)行判斷,這樣很容易產(chǎn)生歧義,就像最后一段代碼一樣。當(dāng)然,已經(jīng)過時的使用方式還是不推薦的,這里僅是做一個了解即可。
接下來我們看一下 assert() 函數(shù)的其他參數(shù),它的第二個參數(shù)是兩種類型,要么給一個字符串用來定義錯誤的信息,要么給一個 異常類 用于拋出異常。
assert(1==1, "驗證不通過"); assert(1==2, "驗證不通過"); // Warning: assert(): 驗證不通過 failed
如果直接給的一個字符串,那么在警告的提示信息中,顯示的就是我們定義的這個錯誤信息的內(nèi)容。這個非常好理解。
// 注意 assert.exception 設(shè)置不同的區(qū)別 assert(1==1, new Exception("驗證不通過")); assert(1==2, new Exception("驗證不通過")); // assert.exception = 1 時,F(xiàn)atal error: Uncaught Exception: 驗證不通過 // assert.exception = 0 時,Warning: assert(): Exception: 驗證不通過
當(dāng)然,我們也可以給一個 異常類 讓斷言拋出一個異常。在默認(rèn)情況下,這個異常的拋出將中止程序的運行。也就是一個正常的異常拋出流程,我們可以使用 try...catch 進(jìn)行異常的捕獲。
try{ assert(1==2, new Exception("驗證不通過")); }catch(Exception $e){ echo "驗證失?。?", $e->getMessage(), PHP_EOL; } // 驗證失??!:驗證不通過
另外還有一個參數(shù)會對斷言的整體運行產(chǎn)生影響,那就是 php.ini 中的 zend.assertions 參數(shù)。它包含三個值:
- 1,生成并執(zhí)行代碼,一般在測試環(huán)境使用
- 0,生成代碼但是在運行時會路過
- -1,不生成代碼,一般在正式環(huán)境使用
這個參數(shù)大家可以自行配置測試,默認(rèn)的 php.ini 中它的默認(rèn)值是 1 ,也就是正常的執(zhí)行 assert() 函數(shù)。
assert_options() 及相對應(yīng)的 php.ini 中的參數(shù)配置
PHP 中的斷言功能還為我們提供了一個 assert_options() 函數(shù),用于方便地設(shè)置和獲取一些和斷言能力有關(guān)的參數(shù)配置。它能夠設(shè)置的斷言標(biāo)志包括:
標(biāo)志 | INI設(shè)置 | 默認(rèn)值 | 描述
- | :-: | :-: | -:
ASSERT_ACTIVE | assert.active | 1 | 啟用 assert() 斷言 ASSERT_WARNING | assert.warning | 1 | 為每個失敗的斷言產(chǎn)生一個 PHP 警告(warning) ASSERT_BAIL | assert.bail | 0 | 在斷言失敗時中止執(zhí)行 ASSERT_QUIET_EVAL | assert.quiet_eval | 0 | 在斷言表達(dá)式求值時禁用 error_reporting ASSERT_CALLBACK | assert.callback | (NULL) | 斷言失敗時調(diào)用回調(diào)函數(shù)
這些參數(shù)的含義都非常好理解,大家可以自己測試一下。我們就來看一下最后一個 ASSERT_CALLBACK 的作用。其實它的說明也非常清楚,就是斷言失敗的情況下就進(jìn)入到這個選項定義的回調(diào)函數(shù)中。
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/一起學(xué)習(xí)PHP中斷言函數(shù)的使用.php" // ====faild====
當(dāng)斷言失敗的時候,我們就進(jìn)入了回調(diào)函數(shù)中,在回調(diào)函數(shù)直接簡單的打印了傳給回調(diào)函數(shù)的參數(shù)內(nèi)容。可以看出,這個回調(diào)函數(shù)里面?zhèn)鬟f過來的是無法通過斷言的文件信息。
總結(jié)
學(xué)習(xí)掌握一下斷言函數(shù)的使用及配置,可以為我們將來學(xué)習(xí) PHPUnit 單元測試打下基礎(chǔ),當(dāng)然,本身這個能力的東西就不是很多,大家記住就好啦!
測試代碼:
以上就是PHP中斷言函數(shù)的使用詳解的詳細(xì)內(nèi)容,更多關(guān)于PHP中斷言函數(shù)的使用的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
php中->?、=>、::、$this->四種常見符號使用方法技巧
php中->?、=>、::、$this->四種符號在代碼中很常見,使用很廣泛。這篇文章主要介紹了php中->?、=>、::、$this->四種常見符號使用方法技巧2022-12-12LINUX下PHP程序?qū)崿F(xiàn)WORD文件轉(zhuǎn)化為PDF文件的方法
這篇文章主要介紹了LINUX下PHP程序?qū)崿F(xiàn)WORD文件轉(zhuǎn)化為PDF文件的方法,涉及php針對Word文檔與pdf格式文件的相關(guān)操作技巧,需要的朋友可以參考下2016-05-05PHP CURL post數(shù)據(jù)報錯 failed creating formpost data
我們有時候用curl上傳文件遇到failed creating formpost data的錯誤,那具體是如何產(chǎn)生,又如何進(jìn)行處理解決呢,下面我們就來探討下2016-10-10將酷狗krc歌詞解析并轉(zhuǎn)換為lrc歌詞php源碼
這篇文章主要介紹了krc歌詞解析并轉(zhuǎn)換為lrc歌詞的php實現(xiàn)方法,需要的朋友可以參考下2014-06-06php將數(shù)組轉(zhuǎn)換成csv格式文件輸出的方法
這篇文章主要介紹了php將數(shù)組轉(zhuǎn)換成csv格式文件輸出的方法,涉及php操作csv文件的技巧,非常具有實用價值,需要的朋友可以參考下2015-03-03