在PHP中定义只读抽象属性

时间:2014-12-21 23:34:11

标签: php

我想在PHP中为抽象类做类似的事情:

abstract class SimpleAbstractObject {
    // Not valid PHP code
    abstract protected static $Description;

    public static function getDescription(){
        return self::$Description;
    }
}

当然,上述情况无法运行:

Fatal error: Properties cannot be declared abstract

我们的想法是,任何扩展'SimpleAbstractObject'的类都必须定义“Description”变量,并且在定义后不能更改。例如:

class SimpleObject extends SimpleAbstractObject {
    protected static $Description = "This is a Simple Object";
}
class AnotherObject extends SimpleAbstractObject {
    protected static $Description = "This is a Another more complicated object";
}

因此最终结果使用如下:

echo SimpleObject::getDescription();
echo AnotherObject::getDescription();

上面会打印出来:

This is a Simple Object
This is a Another more complicated object

1 个答案:

答案 0 :(得分:0)

自5.3以来,您可以将static关键字用于其late-static-binding属性。

abstract class SimpleAbstractObject {
    public static function getDescription() {
        if(!isset(static::$Description))
            throw new UnexpectedValueException(
              get_called_class() .
              ' must define a static getDescription method');
        return static::$Description;
    }
}

子类保持原样

class SimpleObject extends SimpleAbstractObject {
    protected static $Description = "This is a Simple Object";
}
class AnotherObject extends SimpleAbstractObject {
    protected static $Description = "This is a Another more complicated object";
}

但现在按预期工作

  

这是一个简单的对象这是另一个更复杂的对象

这种方法的唯一缺点是你放弃了'编译时'检查。