在事務中使用閉包優化代碼結構

閉包函數

PHP官方文檔對於閉包函數的定義:php

匿名函數(Anonymous functions),也叫閉包函數(closures),容許 臨時建立一個沒有指定名稱的函數。最常常用做回調函數(callback)參數的值。固然,也有其它應用的狀況。

簡單來講,閉包函數也是一種數據類型,能夠直接使用變量來存儲、傳參、調用等等。html

事務

事務簡單來講就是一個核心:mysql

事務處理能夠用來維護數據庫的完整性,保證成批的 SQL 語句要麼所有執行,要麼所有不執行。

通常狀況下,每一條SQL的執行狀況都須要進行判斷,若是執行成功則繼續,不然回滾事務。如下是PDO事務代碼:sql

$pdo = new PDO('mysql:host=localhost;dbname=demo', 'root', 'root');
try {
    $pdo->beginTransaction();
    //todo 業務代碼
    $pdo->commit();
} catch (\Exception $e) {
    $pdo->rollBack();
    throw $e;
}

PHP實現

幾乎全部事務都須要如此處理,可是這樣重複代碼太多,實際上只須要關心的部分是 業務代碼 部分,使用閉包函數能夠很好的解決這個問題。數據庫

閉包函數能夠理解爲具體的業務邏輯,不帶任何事務相關操做,若是出現異常,會自動回滾事務。設計模式

PHP的簡單實現代碼以下:閉包

function transaction(PDO $pdo, callable $callable)
{
    try {
        $pdo->beginTransaction();
        $result = call_user_func($callable, $pdo);
        $pdo->commit();
        return $result;
    } catch (\Exception $e) {
        $pdo->rollBack();
        throw $e;
    }
}

PHP調用方法代碼以下:函數

transaction($pdo, function (PDO $pdo) {
    return $pdo->query('INSERT INTO `test` VALUES (1)');
});

結語

使用閉包函數去簡化樣板代碼在生產中是很常見的,具體的設計模式應該是相似「模板方法模式」。設計

來自個人博客:https://www.ddhigh.com/2019/0...code

相關文章
相關標籤/搜索