0

結果を何にでもキャッシュする Decorator 型クラスを作成しようとしています (memecache から始めます)。各メソッドはキャッシュ $this->cache->get($key) をチェックする必要があり、見つからない場合は実際のメソッド $this->real->getExpensiveInfo01($param1, $param2, $param3) を呼び出してから $this に設定する必要があります->cache->set($key, $expensiveInfo). したがって、各メソッドにはこのボイラープレート コードがあります。

class ExpensiveCache implements ExpensiveInterface
{
  public function getExpensiveInfo01($param1, $param2, $param3)
  {
     $key = __FUNCTION__ . $param1 . $param2 . $param3;
     $rtn = $this->cache->get($key);
     if ($rtn === false) {
        $rtn = $this->expensive->getExpensiveInfo01($param1, $param2, $param3);
        $cacheStatus = $this->cache->set($key, $rtn);
    }
    return $rtn;
  }
  public function getExpensiveInfo02($param1, $param2)
  {
     $key = __FUNCTION__ . $param1 . $param2;
     $rtn = $this->cache->get($key);
     if ($rtn === false) {
        $rtn = $this->expensive->getExpensiveInfo02($param1, $param2);
        $cacheStatus = $this->cache->set($key, $rtn);
    }
    return $rtn;
  }
  public function getExpensiveInfo03($param1, $param2)
  {
     $key = __FUNCTION__ . $param1 . $param2;
     $rtn = $this->cache->get($key);
     if ($rtn === false) {
        $rtn = $this->expensive->getExpensiveInfo03($param1, $param2);
        $cacheStatus = $this->cache->set($key, $rtn);
    }
    return $rtn;
  }
}

ボイラープレートコードを1つのプライベートメソッド呼び出しに減らすために、とにかくPHP5.3(CentOSを気にしないでください)にあります。

4

2 に答える 2

1

プライベートではなくパブリックな__call

class ExpensiveCache implements ExpensiveInterface {
    public function __call($name, $arguments) {
        $key = $name.implode('', $arguments);
        $rtn = $this->cache->get($key);
        if ($rtn === false) {
            $rtn = call_user_func_array(array($this->expensive, $name), $arguments);
            $cacheStatus = $this->cache->set($key, $rtn);
        }
        return $rtn;
    }
}

($this->expensive->$name が呼び出し可能な場合、いくつかのチェックを追加するかもしれません)

于 2013-09-30T22:28:36.377 に答える