1

多くのサブクラスを持つ基本クラスと、関数の結果をキャッシュする汎用関数があります。キャッシュ関数で、どのサブクラスが呼び出されたかを知るにはどうすればよいですか?

class Base {
  public static function getAll() {
    return CacheService::cached(function() {
      // get objects from the database
    });
  }
}

class X extends Base {}
class Y extends Base {}
class Z extends Base {}

class CacheService {
  function cached($callback) {
    list(, $caller) = debug_backtrace();

    // $caller['class'] is always Base!
    // cannot use get_called_class as it returns CacheService!

    // see if function is in cache, otherwise do callback and store results
  }
}

X::getAll();
Z::getAll();
4

2 に答える 2

1

PHP >= 5.3 を使用している場合は、get_called_class().

編集:より明確にするために、メソッドget_called_class()で使用する必要がありますBase::getAll()。もちろん、CacheService::cached()これがどのクラスを報告したかを伝える必要があります (メソッド引数を追加するのが最も簡単な方法です)。

class Base {
  public static function getAll() {
    return CacheService::cached(get_called_class(), function() {
      // get objects from the database
    });
  }
}

class X extends Base {}
class Y extends Base {}
class Z extends Base {}

class CacheService {
  function cached($caller, $callback) {
    // $caller is now the child class of Base that was called

    // see if function is in cache, otherwise do callback and store results
  }
}

X::getAll();
Z::getAll();
于 2012-06-19T15:36:00.390 に答える
0

魔法定数を使ってみる__CLASS__

編集:このように:

class CacheService {
  function cached($class, $callback) {
    // see if function is in cache, otherwise do callback and store results
  }
}


class Base {
  public static function getAll() {
    return CacheService::cached(__CLASS__, function() {
      // get objects from the database
    });
  }
}

さらに編集: get_called_class の使用:

class CacheService {
  function cached($class, $callback) {
    // see if function is in cache, otherwise do callback and store results
  }
}


class Base {
  public static function getAll() {
    return CacheService::cached(get_called_class(), function() {
      // get objects from the database
    });
  }
}
于 2012-06-19T15:14:58.380 に答える