PHP闭包的实际应用场景

PHP 闭包在面试中,很多人就是知道这个形式,一旦问他们在那些场景下使用,基本都回答不上来,整个CSDN上有对闭包源码实现加以解读的,也有举例闭包的几种用法,我这里补充几个应用场景,进一步将闭包的应用进行落地。

高阶函数

1. 在javascript中有高阶函数的概念,高阶函数可以将现有逻辑变得灵活多变,通过动态的传入匿名函数,常见的有array_map,做数组转换非常方便

$roles = array_map(function ($roleId) use ($staff) {
    $role = StoreRole::query()->select(["id", "role_id", "name"])
        ->where(["role_id" => $roleId, "store_id" => $staff['store_id']])
        ->first();
    if ($role) {
        return $role->toArray();
    }
    return ['id' => "", "role_id" => "", "name" => 0];
}, $roles);

装饰器功能

1. redis和mysql事务使用时,如果采用事务函数,将需要处理的逻辑封装到闭包函数中,就省去了捕获回滚和成功后自动提交的逻辑,同时也达到函数处理后的快速回收内存的好处

def log(func):
    def wrapper(*args, **kwargs):
        print('call %s():' % func.__name__)
        return func(*args, **kwargs)
    return wrapper

@log
def now():
    print("2015-3-25")


now()

后置处理

1. 在php脚本运行的整个生命周期中,只有在某些逻辑发生时才会触发相应的逻辑,这些逻辑还是动态定制的,采用一个数组将所有的可能闭包收集,在逻辑处理完毕后,统一进行闭包调用

use Closure;
use Exception;
use Hyperf\DbConnection\Db;


/**
 * @property array $callbacks
 */
class AfterTransaction
{
    public $callbacks = [];

    public function add($func)
    {
        $this->callbacks[] = $func;
    }
}


class Transaction
{
    /**
     * @param Closure $func
     * @return mixed
     * @throws Exception
     */
    public static function getTransactionWrapper(Closure $func)
    {

        Db::beginTransaction();
        try {
            $afterTransaction = new AfterTransaction();
            $result = $func($afterTransaction);
            Db::commit();
            foreach ($afterTransaction->callbacks as $callback) {
                if ($callback instanceof Closure) {
                    $callback();
                }
            }
            return $result;
        } catch (Exception $e) {
            Db::rollBack();
            throw $e;
        }
    }
}

回调函数

1. 闭包的产生就是为了方便异步操作,把异步处理的逻辑简化封装为一个函数,用简单的方式保存当前的变量信息,等到异步回调时,拉起来重新执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值