国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

PHP中斷言函數的使用詳解

瀏覽:4日期:2022-09-07 15:59:42

原來一直以為斷言相關的函數是 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 ' ' failedassert('1');// Deprecated: assert(): Calling assert() with a string argument is deprecatedassert(0);// Warning: assert(): assert(0) failedassert(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 單元測試打下基礎,當然,本身這個能力的東西就不是很多,大家記住就好啦!

測試代碼:

github.com/zhangyue050…

以上就是PHP中斷言函數的使用詳解的詳細內容,更多關于PHP中斷言函數的使用的資料請關注好吧啦網其它相關文章!

標簽: PHP
相關文章:
主站蜘蛛池模板: 日韩午夜视频在线观看 | 亚洲精品一级一区二区三区 | 成人三级在线观看 | 波多野结衣视频在线观看地址免费 | 国产99网站 | 欧美成人eee在线 | 亚洲视频在线观看一区 | 欧美高清在线精品一区 | 中国一级特黄真人毛片 | 午夜dj视频完整社区 | 亚洲国产成人99精品激情在线 | 国产深夜福利 | 怡红院自拍 | 久久在线观看免费视频 | 亚洲一区二区三区精品影院 | 国产精选91热在线观看 | 手机看成人片 | 成人日韩在线观看 | 午夜伦y4480影院中文字幕 | 成年女人免费又黄又爽视频 | 日本b站一卡二卡乱码入口 日本s色大片在线观看 | 人成精品视频三区二区一区 | 国产乱码精品一区二区三区中 | 亚洲欧美日韩精品高清 | 欧美日韩精品一区二区三区不卡 | 国产精品影视 | 国产韩国精品一区二区三区 | 国产无卡一级毛片aaa | 久久久国产乱子伦精品 | 日韩欧美一区二区在线 | 成人免费真人毛片视频 | 国产成人亚洲精品一区二区在线看 | 成人禁在线观看网站 | 亚洲依依成人综合在线网址 | 综合自拍亚洲综合图区美腿丝袜 | 精品九九视频 | 91精品国产91热久久久久福利 | 在线国产高清 | 男人天堂新地址 | 久久狠狠一本精品综合网 | 日韩国产中文字幕 |