国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

你所不知的 PHP 斷言(assert)

Pines_Cheng / 728人閱讀

摘要:中的斷言常用于調(diào)試,檢查一個表達式或語句是否為。用的最多的場景就是單元測試,一般的單元測試框架都采用了斷言。運行結(jié)果中的斷言在中,采用函數(shù)對表達式進行斷言。單元測試測試不通過測試不通過是不是跟我們用寫單元測試很像

PHP 中的斷言常用于調(diào)試,檢查一個表達式或語句是否為 FALSE。本文帶你重新認識 PHP assert() 函數(shù)的神(Qi)通(Yin)廣(Ji)大(Qiao)。

本文基于 PHP Version 7.1.28

什么是斷言

編寫程序時,常會做出一定的假設(shè),那斷言就是用來捕獲假設(shè)的異常,我們也可以認為斷言是異常的一種特殊形式。

斷言一般用于程序執(zhí)行結(jié)構(gòu)的判斷,不可讓斷言處理業(yè)務(wù)流程。用的最多的場景就是單元測試,一般的單元測試框架都采用了斷言。

assert(1 == 2);

// 運行結(jié)果:
// Warning: assert(): assert(1 == 2) failed in /Users/shocker/Desktop/demo.php on line 25
PHP 中的斷言

在 PHP 中,采用 assert() 函數(shù)對表達式進行斷言。

// PHP 5
assert ( mixed $assertion [, string $description ] ) : bool

// PHP 7
assert ( mixed $assertion [, Throwable $exception ] ) : bool
傳統(tǒng)的斷言方式 (PHP 5 & 7)
參數(shù) assertion 既支持表達式,也支持表達式字符串(某些特定的場景會用到,比如判斷某個字符串表達式是否合法)

如果 assertion 是字符串,它將會被 assert() 當(dāng)做 PHP 代碼來執(zhí)行。assertion 是字符串的優(yōu)勢是當(dāng)禁用斷言時它的開銷會更小,并且在斷言失敗時消息會包含 assertion 表達式

斷言這個功能應(yīng)該只被用來調(diào)試。你應(yīng)該用于完整性檢查時測試條件是否始終應(yīng)該為 TRUE,來指示某些程序錯誤,或者檢查具體功能的存在(類似擴展函數(shù)或特定的系統(tǒng)限制和功能)。

斷言不應(yīng)該用于普通運行時操作,類似輸入?yún)?shù)的檢查。作為一個經(jīng)驗法則,在斷言禁用時你的代碼也應(yīng)該能夠正確地運行。

使用示例:

function my_assert_handler($file, $line, $code, $desc)
{
    echo "Assertion Failed:
    File "{$file}"
    Line "{$line}"
    Code "{$code}"
    Desc "{$desc}"
";
}

// 設(shè)置回調(diào)函數(shù)
assert_options(ASSERT_CALLBACK, "my_assert_handler");

// 讓一則斷言失敗
assert("1 == 2", "1 不可能等于 2");

運行結(jié)果:

Assertion Failed:
    File "/Users/shocker/Desktop/demo.php"
    Line "29"
    Code "1 == 2"
    Desc "1 不可能等于 2"
支持異常的斷言 (僅 PHP 7)

在 PHP 7 中,assert() 是一個語言結(jié)構(gòu),允許在不同環(huán)境中生效不同的措施,具體可見 zend.assertions 配置。

另外,還支持通過 AssertionError 捕獲錯誤。

使用示例:

assert_options(ASSERT_EXCEPTION, 1); // 在斷言失敗時產(chǎn)生異常

try {
    // 用 AssertionError 異常替代普通字符串
    assert(true == false, new AssertionError("True is not false!"));
} catch (Throwable $e) {
    echo $e->getMessage();
}

運行結(jié)果:

True is not false!
對斷言行為進行控制

PHP 支持 assert_options() 函數(shù)對斷言進行配置,也可用 ini 進行設(shè)置

以下配置中,常量標志用于 assert_options() 函數(shù)進行配置,ini 設(shè)置用于 ini_set() 函數(shù)設(shè)置,效果一樣
標志 INI 設(shè)置 默認值 描述
ASSERT_ACTIVE assert.active "1" 啟用 assert() 斷言
ASSERT_WARNING assert.warning "1" 為每個失敗的斷言產(chǎn)生一個 PHP 警告(warning)
ASSERT_BAIL assert.bail "0" 在斷言失敗時中止執(zhí)行
ASSERT_QUIET_EVAL assert.quiet_eval "0" 在斷言表達式求值時禁用 error_reporting
ASSERT_CALLBACK assert.callback NULL 斷言失敗時調(diào)用該回調(diào)函數(shù)
ASSERT_EXCEPTION assert.exception "0" 在斷言失敗時產(chǎn)生 AssertionError 異常 (自 PHP 7.0.0 起有效)

zend.assertions 是個特殊的配置(PHP >= 7.0.0 支持),控制不同運行環(huán)境下斷言的行為,僅可用 ini_set() 進行設(shè)置。并且,設(shè)置了1就不能再設(shè)置為-1,反之亦然,其他不受限。

1: 編譯代碼,并執(zhí)行(開發(fā)模式)

0: 編輯代碼,但運行時跳過

-1: 不編譯代碼(生產(chǎn)模式)

版本的不兼容

PHP >= 5.4.8,description 可作為第四個參數(shù)提供給 ASSERT_CALLBACK 模式里的回調(diào)函數(shù)

在 PHP 5 中,參數(shù) assertion 必須是可執(zhí)行的字符串,或者運行結(jié)果為布爾值的表達式

在 PHP 7 中,參數(shù) assertion 可以是任意表達式,并用其運算結(jié)果作為斷言的依據(jù)

在 PHP 7 中,參數(shù) exception 可以是個 Throwable 對象,用于捕獲表達式運行錯誤或斷言結(jié)果為失敗。(當(dāng)然 assert.exception 需開啟)

PHP >= 7.0.0,支持 zend.assertionsassert.exception 相關(guān)配置及其特性

PHP >= 7.2 版本開始,參數(shù) assertion 不再支持字符串

詳見 PHP 7.2.x 中廢棄的功能
Deprecated: assert(): Calling assert() with a string argument is deprecated

應(yīng)用場景 調(diào)試輸出

先看示例:

assert("1 == 2", "1 不可能等于 2");

運行結(jié)果:

Warning: assert(): 1 不可能等于 2: "1 == 2" failed in /Users/shocker/Desktop/demo.php on line 10

類似于:

$expression = 1 == 2;
if (!($expression)) {
    echo "1 不可能等于 2
";
    var_dump($expression);
    echo __FILE__ . "
";
}

但是,我們無法得知 $expression 的具體表達式,也無法得知具體的執(zhí)行行數(shù)。

單元測試
function arraySum(array $nums) {
    $sum = 0;
    foreach ($nums as $n) {
        $sum += $n;
    }

    return $sum;
}

assert(arraySum([1, 2, 3]) == 6, "arraySum() 測試不通過:");
assert(is_numeric(arraySum([1, 2, 3])), "arraySum() 測試不通過:");

是不是跟我們用 PHPUnit 寫單元測試很像

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/31627.html

相關(guān)文章

  • 【modernPHP專題(11)】斷言ASSERT

    摘要:可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言,而在部署時禁用斷言。會檢查指定的并在結(jié)果為時采取適當(dāng)?shù)男袆右暥āV械臄嘌韵蚝蠹嬗貌⒃鰪娭暗牡姆椒āK沟迷谏a(chǎn)環(huán)境中啟用斷言為零成本,并且提供當(dāng)斷言失敗時拋出特定異常的能力。 簡述 編寫代碼時,我們總是會做出一些假設(shè),斷言就是用于在代碼中捕捉這些假設(shè),可以將斷言看作是異常處理的一種高級形式。程序員斷言在程序中的某個特定點該...

    WalkerXu 評論0 收藏0
  • 16.java異常處理

    摘要:不受檢查異常為編譯器不要求強制處理的異常,檢查異常則是編譯器要求必須處置的異常。潛在的異常處理器是異常發(fā)生時依次存留在調(diào)用棧中的方法的集合。當(dāng)運行時系統(tǒng)遍歷調(diào)用棧而未找到合適的異常處理器,則運行時系統(tǒng)終止。異常處理涉及到五個關(guān)鍵字,分別是。 概念 程序運行時,發(fā)生的不被期望的事件,它阻止了程序按照程序員的預(yù)期正常執(zhí)行,這就是異常。 異常是程序中的一些錯誤,但并不是所有的錯誤都是異常,并...

    asce1885 評論0 收藏0
  • 【Node Hero】9. Node.js 單元測試

    摘要:基本上,測試金字塔描述你應(yīng)該編寫單元測試集成測試和端到端測試。集成測試要比端到端測試多,單元測試甚至要更多一些。應(yīng)用程序單元測試編寫單元測試,是為了看看給定的模塊單元是否工作。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀事鏈接:http://www.zcfy.cc/article/1754原文:https://blog.risingstack.com/node-hero-node-js-un...

    104828720 評論0 收藏0
  • phpunit PHP單元測試利器

    摘要:是的單元測試框架。單元測試在軟件開發(fā)中越來越受到重視,測試先行編程極限編程和測試驅(qū)動開發(fā)在實踐中被廣泛。利用單元測試,也可以實現(xiàn)契約式設(shè)計。現(xiàn)在第二個測試也能通過啦你也可以使用契約式設(shè)計的風(fēng)格,只需使用類提供的靜態(tài)斷言方法編寫契約條件。 PHPUnit是PHP的單元測試框架。單元測試在軟件開發(fā)中越來越受到重視,測試先行編程、極限編程和測試驅(qū)動開發(fā)在實踐中被廣泛。利用單元測試,也可以實現(xiàn)...

    wyk1184 評論0 收藏0
  • Python中不盡如人意斷言Assertion

    摘要:為何不盡如人意中的斷言用起來非常簡單,你可以在后面跟上任意判斷條件,如果斷言失敗則會拋出異常。中的斷言可讀性很好,而且智能提示也很方便你通過輕松完成各種斷言語句。而且它的斷言信息簡潔明了,不多不少。 Python Assert 為何不盡如人意 Python中的斷言用起來非常簡單,你可以在assert后面跟上任意判斷條件,如果斷言失敗則會拋出異常。 >>> assert 1 + 1 ==...

    The question 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<