PHP中斷言函式的使用詳解

2022-09-25 19:09:15 字數 3267 閱讀 4216

原來一直以為斷言相關的函式是 phpunit 這些單元測試元件提供的,在閱讀手冊後才發現,這個 assert() 斷言函式是 php 本身就自帶的乙個函式。也就是說,我們在**中進行簡單的測試的時候是不需要完全引入整個單元測試元件的。

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 進行異常的捕獲。

trycatch(exception $e)

// 驗證失敗!:驗證不通過

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

這個引數大家可以自行配置測試,預設的 php.ini 中它的預設值是 www.cppcns.com1 ,也就是正常的執行 assert() 函式。

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));

assert(1!=1);

// ====faild====

// string(105) ".../source/一起學習php中斷言函式的使用.php"

// ====faild====

當斷言失敗的時候,我們就進入了**函式中,在**函式直接簡單的列印了傳給**函式的引數內容。可以看出,這個**函式裡面傳遞過來的是無法通過斷言的檔案資訊。

學習掌握一下斷言函式的使用及配置,可以為我們將來學習 phpunit 單元測試打下基礎,當然,本身這個能力的東西就不是很多,大家記住就好啦!

測試**:

unittest中斷言的使用

斷言使用 unittest中提供斷言assert各種方法 所以使用前需要匯入import unittest 常用的有 assertequal first,second,msg assertless first.second,msg first注意 當斷言為真時,會執行斷言之後的 如 在斷言之後列印成...

程式設計中斷言函式作用

編寫 時,我們總是會做出一些假設,斷言就是用於在 中捕捉這些假設。斷言表示為一些布林表示式,程式設計師相信在程式中的某個特定點該表示式值為真,可以在任何時候啟用和禁用斷言驗證 因此可以在測試時啟用斷言而在部署時禁用斷言。同樣,程式投入執行後,終端使用者在遇到問題時可以重新啟用斷言。使用斷言可以建立更...

六 RF中斷言關鍵字使用詳解

1.should be equal 和should be not equal 比較兩個值相等或不相等 2.should start with 和should not start with 判斷以該內容開頭或不是以該內容開頭 3.should end with 和should not end with...