1. 程式人生 > 程式設計 >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){
    jLnuqalqecho "驗證失敗!:",$e->getMessage(),PHP_EOL;
}
// 驗證失敗!:驗證不通過

另外還有一個引數會對斷言的整體執行產生影響,那就是 php.ini 中的 zend.assertions 引數。它包含三個值:

  • 1,生成並執行程式碼,一般在測試環境使用
  • 0,生成程式碼但是在執行時會路過
  • -1,不生成程式碼,一般在正式環境使用

這個引數大家可以自行配置測試,預設的 php.ini 中它的預設值是 www.cppcns.com1 ,也就是正常的執行 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_A程式設計客棧CTIVE,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中斷言函式的使用的資料請關注我們其它相關文章!