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

427

被折叠的 条评论
为什么被折叠?



