gpt4 book ai didi

php - 如何在php中的回调函数中传递参数?

转载 作者:可可西里 更新时间:2023-11-01 13:04:25 24 4
gpt4 key购买 nike

我有一个 Repository 类,其方法如下:

public function GetOne($id){
$method = __METHOD__;
$post = null;


$post = $this->CacheManager($method, function($id) {
return DB::select("select * from posts where id = ?", [$id]);
});

return $post;
}

我想缓存结果,但是在闭包/回调函数中 $id 参数不起作用。 CacheManager 是我在我的存储库中使用它的特征。

public function CacheManager($method, $fn) {
$obj = null;

if(!$this->HasCache($method)){
$obj = $fn();
}else {
$obj = $this->GetCache($method);
}

return $obj;
}

我还有其他一些没有参数的方法,它们按预期工作。

最佳答案

使用use . :D

使用 use 子句,您可以将变量从父作用域导入到函数作用域中。

public function GetOne($id){
$method = __METHOD__;
$post = null;


$post = $this->CacheManager($method, function() use ($id) {
return DB::select("select * from posts where id = ?", [$id]);
});

return $post;
}

只是一个旁注。由于看起来您正在构建缓存机制,因此您还需要将 ID 包含在缓存中。目前您只能通过 $method 检查,但对于每个 id,您可能会有一个不同的缓存条目,该条目可能存在也可能不存在。所以我认为在你的函数中你需要做类似下面一行的事情来使缓存键更加独特。我还会将参数 $method 称为类似 $cacheKey 的东西,因为对于缓存,它本身不应链接到方法名称。

$method = __METHOD__ . ";$id";

PHP 7.4 更新:箭头函数

RFC for arrow functions (又名“短期关闭”)已通过投票。

对于这些,您无需指定要关闭的参数,因为无论如何它们只能有一个表达式,因此它们使用的任何表达式/值都可以(并且将会)从父函数范围中获取。

由于在这种情况下匿名函数只有一条语句,因此可以将其重写为箭头函数。对缓存管理器的调用将如下所示:

public function GetOne($id){
$method = __METHOD__;
$post = null;

$post = $this->CacheManager($method, fn() => DB::select("select * from posts where id = ?", [$id]));

return $post;
}

关于php - 如何在php中的回调函数中传递参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35035355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com