11

だから、これは私の特徴です:

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 が抽象的ではなく、これらのキャッシュプロパティを設定しようとしていると仮定してください。質問は同じままです。

4

3 に答える 3

7

特性プロパティを再割り当てすることはできません。

PHPマニュアルからhttp://php.net/traits

例 #12 競合の解決を参照してください

特性がプロパティを定義する場合、クラスは同じ名前のプロパティを定義できません。そうしないと、エラーが発行されます。クラス定義に互換性がある (可視性と初期値が同じ) 場合は E_STRICT、それ以外の場合は致命的なエラーです。

1 つの解決策は、クラスでオーバーライド プロパティを定義することです。

class Class2 extends BaseClass
{
    protected static $_isCacheEnabled = true;
    protected static $_cacheExpirationTime = 3600;
    ...
}

そして、そのようにあなたの特性を変更します...

trait Cacheable
{
    protected static $isCacheEnabled = false;
    protected static $cacheExpirationTime = null;

    public static function isCacheEnabled()
    {

        if ( Cache::isEnabled() ) {
            return isset( static::$_isCacheEnabled ) ? static::$_isCacheEnabled :
                static::$isCacheEnabled;
        } else {
            return false;
        }

    }

    public static function getCacheExpirationTime()
    {
        return isset ( static::$_cacheExpirationTime ) ? static::$_cacheExpirationTime :        
            static::$cacheExpirationTime;
    }
}
于 2013-12-07T04:50:29.343 に答える
0

あなたは定義された()を使用することができます:

// only defined in classes
// static $isCacheEnabled = false;

public static function isCacheEnabled()
{
    return defined(static::$isCacheEnabled ) ? static::$isCacheEnabled : false;
}

それとも、静的ではなく保護されている変数を使用できますか?

于 2016-08-20T17:22:12.860 に答える