2016-01-27 5 views
0

У меня есть Repository класса с методом следующим образом:Как передать аргумент в функции обратного вызова в php?

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; 
} 

Я хочу, чтобы кэшировать результат, но в функции закрытия/обратного вызова параметр идентификатора $ не работает. CacheManager - это признак, в котором я использую его в своем репозитории.

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

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

     return $obj; 
    } 

У меня есть другие методы без параметров, и они работают по назначению.

+0

Ну, вы никогда не прошло '$ id' в' CacheManager' ни делали вы передаете его '$ п();'. Вам также нужно передать аргументы. – Mjh

ответ

4

Использование 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; 
} 

Просто примечание стороны. Поскольку, похоже, вы создаете механизм кэширования, вам также необходимо включить идентификатор в кеш. В настоящее время вы проверяете только $method, но для каждого идентификатора вы, вероятно, будете иметь другую запись в кеше, которая может быть или не существовать. Поэтому я думаю, что в вашей функции вам нужно сделать что-то вроде строки ниже, чтобы сделать ключ кеша более уникальным. Я бы также назвал параметр $method чем-то вроде $cacheKey, так как в кэш он не должен быть связан с именем метода как таковым.

$method = __METHOD__ . ";$id"; 
+0

Спасибо, я понял. – marko

+0

Хорошо, хороший совет, я подумаю об этом. – marko

+1

Добро пожаловать. Вы получите странное поведение, если вы получите ложные срабатывания в соответствии с ключами кеша. Я говорю по опыту. : D – GolezTrol

0

$fn() нужен аргумент ...

if(!$this->HasCache($method)){ 
    $obj = $fn($id); 
} 
Смежные вопросы