PHP:类中的静态Readonly属性

时间:2011-12-07 09:47:47

标签: php static get set magic-methods

大家好日子!

我的问题是:我需要在类中重载标准get并为静态变量设置...但是在php中没有提供这样的功能...它在2008年被问到但仍未实现...同样适用于readonly。 ..

我的问题:有没有办法让静态属性可以从外部读取,但是可以防止修改?

echo aaa::$qwe; //<--- echoes value of $qwe
aaa::$qwe = '666'; //<--- throws an error because variable is protected from modification

我不能使用const,因为有些变量包含数组。

也许有一些解决方法?

是的,我知道我可以把它变成aaa :: Get('qwe'),但这并不好......

3 个答案:

答案 0 :(得分:4)

直接回答您的问题:不,您不能将常规属性标记为只读。如果你想设置原始类型(array除外),那将永远不会改变,你应该使用常量

const QWE = '666';

这对于对象和数组不起作用。我看到两个(让我们说)“解决方案”

  1. 使用Getter

    private $qwe;
    public function getQwe() { return $this->qwe; }
    protected function setQwe($value) { $this->qwe = $value; }
    

    我不太喜欢它们(“属性定义状态,而不是行为,就像方法一样”)。你总是得到两倍于属性的额外方法,如果你有很多属性,这将极大地炸毁你的课程。但是,据我所知,实现你想要实现的目标只是唯一的方法。

  2. 信任您的用户;)评论您的财产并说出“如果您更改此值,可能会出现问题并且您自己的错误”。

    /**
     * QWE
     *
     * This property should be treatened as "readonly". If you change this value
     * something scary will happen to you.
     *
     * @readonly
     * @var string
     */
    public $qwe = '666';
    

    它不是很好,但至少你可以说“我告诉你了”。

答案 1 :(得分:1)

如果值永远不会更改,则可以使用const代替。 否则,没有办法满足你的限制(没有通过扩展来挂钩PHP中的函数调用,但即使这样你也需要改变对函数调用的静态变量访问;否则,你必须修补PHP)。 / p>

当然,您的应用程序正在做的是良好的设计是非常值得怀疑的。依赖于改变静态属性与依赖全局变量或多或少相同。

答案 2 :(得分:0)

这有点容易:

class aaa{
private static $qwe='rty';
public static function qwe() { return self::$qwe; }
}

它不允许更改,并且仍然易于访问:

aaa::$qwe = 'something'; // fails
echo aaa::qwe(); // success

我知道这不太理想,但你可以替换所有

aaa::$qwe 

aaa::$qwe()