中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

PHP中斷言函數(shù)的用法

本篇內(nèi)容介紹了“PHP中斷言函數(shù)的用法”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)建站專注于寶坻網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供寶坻營(yíng)銷型網(wǎng)站建設(shè),寶坻網(wǎng)站制作、寶坻網(wǎng)頁(yè)設(shè)計(jì)、寶坻網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造寶坻網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供寶坻網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

原來(lái)一直以為斷言相關(guān)的函數(shù)是 PHPUnit 這些單元測(cè)試組件提供的,在閱讀手冊(cè)后才發(fā)現(xiàn),這個(gè) assert() 斷言函數(shù)是 PHP 本身就自帶的一個(gè)函數(shù)。也就是說(shuō),我們?cè)诖a中進(jìn)行簡(jiǎn)單的測(cè)試的時(shí)候是不需要完全引入整個(gè)單元測(cè)試組件的。

assert() 斷言函數(shù)

assert(1==1);

assert(1==2);
// assert.exception = 0 時(shí),Warning: assert(): assert(1 == 2)
// assert.exception = 1 時(shí),F(xiàn)atal error: Uncaught AssertionError: 驗(yàn)證不通過(guò)

很明顯,第二段代碼無(wú)法通過(guò)斷言驗(yàn)證。這時(shí),PHP 就會(huì)返回一個(gè)警告或者異常錯(cuò)誤。為什么有可能是兩種錯(cuò)誤形式呢?當(dāng)我們?cè)O(shè)置 php.ini 中的 assert.exception 為 off 或者 0 時(shí),也就是關(guān)閉這個(gè)參數(shù)的能力時(shí),程序就會(huì)以 PHP5 的形式依然返回一個(gè)警告,就像上面代碼中的注釋一樣。同時(shí),通過(guò) try...catch 也無(wú)法進(jìn)行異常的捕獲了。這個(gè)參數(shù)其實(shí)就是控制是否以正宗的異常對(duì)象進(jìn)行拋出。如果保持這個(gè)參數(shù)為默認(rèn)情況也就是設(shè)置為 on 或者 1 的話,就會(huì)直接拋出異常,程序中止。

從上述代碼可以看出,斷言的第一個(gè)參數(shù)是一個(gè)表達(dá)式,而且是需要一個(gè)返回 bool 類型對(duì)象的表達(dá)式。如果我們傳遞的是一個(gè)字符串或者一個(gè)數(shù)字呢?

// 設(shè)置 assert.exception = 0 進(jìn)行多條測(cè)試

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

很明顯第一個(gè)參數(shù)的表達(dá)式會(huì)進(jìn)行類型強(qiáng)制轉(zhuǎn)換,但是字符串類型會(huì)多出一個(gè)過(guò)時(shí)提醒,表明給 assert() 函數(shù)傳遞字符串類型的表達(dá)式類型已經(jīng)過(guò)時(shí)了。當(dāng)前的測(cè)試版本是 7.3 ,在將來(lái)可能就會(huì)直接報(bào)中止運(yùn)行的錯(cuò)誤或異常了。主要問(wèn)題在于,如果傳遞的字符串本身也是一個(gè)表達(dá)式的話,會(huì)以這個(gè)表達(dá)式的內(nèi)容為基礎(chǔ)進(jìn)行判斷,這樣很容易產(chǎn)生歧義,就像最后一段代碼一樣。當(dāng)然,已經(jīng)過(guò)時(shí)的使用方式還是不推薦的,這里僅是做一個(gè)了解即可。

接下來(lái)我們看一下 assert() 函數(shù)的其他參數(shù),它的第二個(gè)參數(shù)是兩種類型,要么給一個(gè)字符串用來(lái)定義錯(cuò)誤的信息,要么給一個(gè) 異常類 用于拋出異常。

assert(1==1, "驗(yàn)證不通過(guò)");

assert(1==2, "驗(yàn)證不通過(guò)");
// Warning: assert(): 驗(yàn)證不通過(guò) failed

如果直接給的一個(gè)字符串,那么在警告的提示信息中,顯示的就是我們定義的這個(gè)錯(cuò)誤信息的內(nèi)容。這個(gè)非常好理解。

// 注意 assert.exception 設(shè)置不同的區(qū)別

assert(1==1,  new Exception("驗(yàn)證不通過(guò)"));

assert(1==2,  new Exception("驗(yàn)證不通過(guò)"));
// assert.exception = 1 時(shí),F(xiàn)atal error: Uncaught Exception: 驗(yàn)證不通過(guò)
// assert.exception = 0 時(shí),Warning: assert(): Exception: 驗(yàn)證不通過(guò)

當(dāng)然,我們也可以給一個(gè) 異常類 讓斷言拋出一個(gè)異常。在默認(rèn)情況下,這個(gè)異常的拋出將中止程序的運(yùn)行。也就是一個(gè)正常的異常拋出流程,我們可以使用 try...catch 進(jìn)行異常的捕獲。

try{
    assert(1==2,  new Exception("驗(yàn)證不通過(guò)"));
}catch(Exception $e){
    echo "驗(yàn)證失??!:", $e->getMessage(), PHP_EOL;
}
// 驗(yàn)證失敗!:驗(yàn)證不通過(guò)

另外還有一個(gè)參數(shù)會(huì)對(duì)斷言的整體運(yùn)行產(chǎn)生影響,那就是 php.ini 中的 zend.assertions 參數(shù)。它包含三個(gè)值:

  • 1,生成并執(zhí)行代碼,一般在測(cè)試環(huán)境使用

  • 0,生成代碼但是在運(yùn)行時(shí)會(huì)路過(guò)

  • -1,不生成代碼,一般在正式環(huán)境使用

這個(gè)參數(shù)大家可以自行配置測(cè)試,默認(rèn)的 php.ini 中它的默認(rèn)值是 1 ,也就是正常的執(zhí)行 assert() 函數(shù)。

assert_options() 及相對(duì)應(yīng)的 php.ini 中的參數(shù)配置

PHP 中的斷言功能還為我們提供了一個(gè) 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 | 為每個(gè)失敗的斷言產(chǎn)生一個(gè) PHP 警告(warning) ASSERT_BAIL | assert.bail | 0 | 在斷言失敗時(shí)中止執(zhí)行 ASSERT_QUIET_EVAL | assert.quiet_eval | 0 | 在斷言表達(dá)式求值時(shí)禁用 error_reporting ASSERT_CALLBACK | assert.callback | (NULL) | 斷言失敗時(shí)調(diào)用回調(diào)函數(shù)

這些參數(shù)的含義都非常好理解,大家可以自己測(cè)試一下。我們就來(lái)看一下最后一個(gè) ASSERT_CALLBACK 的作用。其實(shí)它的說(shuō)明也非常清楚,就是斷言失敗的情況下就進(jìn)入到這個(gè)選項(xiàng)定義的回調(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)斷言失敗的時(shí)候,我們就進(jìn)入了回調(diào)函數(shù)中,在回調(diào)函數(shù)直接簡(jiǎn)單的打印了傳給回調(diào)函數(shù)的參數(shù)內(nèi)容??梢钥闯?,這個(gè)回調(diào)函數(shù)里面?zhèn)鬟f過(guò)來(lái)的是無(wú)法通過(guò)斷言的文件信息。

總結(jié)

學(xué)習(xí)掌握一下斷言函數(shù)的使用及配置,可以為我們將來(lái)學(xué)習(xí) PHPUnit 單元測(cè)試打下基礎(chǔ),當(dāng)然,本身這個(gè)能力的東西就不是很多,大家記住就好啦!

測(cè)試代碼:
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中斷言函數(shù)的用法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

文章題目:PHP中斷言函數(shù)的用法
文章網(wǎng)址:http://www.rwnh.cn/article28/gshojp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站排名、小程序開發(fā)、服務(wù)器托管靜態(tài)網(wǎng)站、網(wǎng)站營(yíng)銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
巴彦淖尔市| 临湘市| 西昌市| 保德县| 延吉市| 那坡县| 汽车| 芜湖市| 巴楚县| 黄龙县| 漾濞| 滕州市| 澎湖县| 桦川县| 武穴市| 阿坝| 平江县| 伊吾县| 会宁县| 鄂伦春自治旗| 武胜县| 南涧| 乐业县| 措勤县| 苏尼特右旗| 西乌珠穆沁旗| 东城区| 平湖市| 策勒县| 宁都县| 潮安县| 金川县| 宝兴县| 丰城市| 麻栗坡县| 抚州市| 涞水县| 安远县| 兰溪市| 房产| 垫江县|