PHP特征 - 更改继承类中静态属性的值

mor*_*h84 8 php inheritance properties traits redefinition

所以,这是我的特点:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是基类:

abstract class BaseClass extends SomeOtherBaseClass
{
    use Cacheable;
    ...
}
Run Code Online (Sandbox Code Playgroud)

这是我的2个最后课程:

class Class1 extends BaseClass
{
    ...
}

class Class2 extends BaseClass
{
    protected static $isCacheEnabled = true;
    protected static $cacheExpirationTime = 3600;
    ...
}
Run Code Online (Sandbox Code Playgroud)

以下是执行这些类的代码部分:

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);
        }
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

此代码不起作用,因为PHP抱怨在Class2中定义与Cacheable中相同的属性.我无法在它们的构造函数中设置它们,因为我想在运行构造函数之前读取它们.我很开心,任何帮助都会受到赞赏.:)

编辑:

好吧,我在几个地方使用这个可缓存的特性,所以我有点混淆了.:)这样很好用.但我有另一个直接使用Cacheable特性的类,当我尝试在该类上执行此操作时,我得到了提到的错误.所以......假设BaseClass不是抽象的,我正在尝试在其上设置这些缓存属性.问题仍然存在.

Tar*_*q C 5

您无法重新分配特质属性.

来自PHP手册http://php.net/traits

参见示例#12冲突解决

如果特征定义了属性,则类无法定义具有相同名称的属性,否则将发出错误.如果类定义兼容(相同的可见性和初始值)或其他致命错误,则为E_STRICT.

一种解决方案是在类中定义覆盖属性

class Class2 extends BaseClass
{
    protected static $_isCacheEnabled = true;
    protected static $_cacheExpirationTime = 3600;
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后修改你的特质......

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,但这很丑陋,我有 2 个相同的属性。:/ (2认同)