淺談PHP中斷言函數的用法

青灯夜游
發布: 2023-04-10 09:04:01
轉載
2761 人瀏覽過

本篇文章帶大家了解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中文網其他相關文章!

相關標籤:
php
來源:juejin.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板