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

时间:2016-01-27 10:55:12

标签: php

我有一个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;
}

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

2 个答案:

答案 0 :(得分:20)

使用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(AKA'短暂关闭')已通过投票。

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

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

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

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

    return $post;
}

答案 1 :(得分:0)

$fn()需要一个论点......

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