だから、これは私の特徴です:
trait Cacheable
{
protected static $isCacheEnabled = false;
protected static $cacheExpirationTime = null;
public static function isCacheEnabled()
{
return static::$isCacheEnabled && Cache::isEnabled();
}
public static function getCacheExpirationTime()
{
return static::$cacheExpirationTime;
}
}
これは基本クラスです:
abstract class BaseClass extends SomeOtherBaseClass
{
use Cacheable;
...
}
これらは私の2つの最終クラスです:
class Class1 extends BaseClass
{
...
}
class Class2 extends BaseClass
{
protected static $isCacheEnabled = true;
protected static $cacheExpirationTime = 3600;
...
}
これらのクラスを実行するコードの一部を次に示します。
function baseClassRunner($baseClassName)
{
...
$output = null;
if ($baseClassName::isCacheEnabled()) {
$output = Cache::getInstance()->get('the_key');
}
if ($output === null) {
$baseClass = new $baseClassName();
$output = $baseClass->getOutput();
if ($baseClassName::isCacheEnabled()) {
Cache::getInstance()->set('the_key', $output);
}
}
...
}
このコードは、PHP が Class2 で Cacheable と同じプロパティを定義することについて不平を言うため、機能しません。コンストラクターを実行する前でも読み取りたいため、コンストラクターに設定できません。私はアイデアを受け入れています。どんな助けもいただければ幸いです。:)
編集:
ええと、私はこの Cacheable trait をいくつかの場所で使用しているので、ちょっと混乱しました。:) これはこのようにうまく動作します。しかし、Cacheable トレイトを直接使用する別のクラスがあり、そのクラスでこれを実行しようとすると、言及されたエラーが発生します。だから... BaseClass が抽象的ではなく、これらのキャッシュプロパティを設定しようとしていると仮定してください。質問は同じままです。