PHP:类中的静态Readonly属性

New*_*ger 7 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
Run Code Online (Sandbox Code Playgroud)

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

也许有一些解决方法?

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

Kin*_*nch 5

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

const QWE = '666';
Run Code Online (Sandbox Code Playgroud)

这不适用于对象和数组。我看到两个(可以说)“解决方案”

  1. 使用吸气剂

    private $qwe;
    public function getQwe() { return $this->qwe; }
    protected function setQwe($value) { $this->qwe = $value; }
    
    Run Code Online (Sandbox Code Playgroud)

    我不太喜欢它们(“属性定义状态,而不是行为,就像方法一样”)。您总是获得两倍于属性的附加方法,如果您有很多属性,这将极大地破坏您的类。然而,据我所知,这是实现您想要实现的目标的唯一方法。

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

    虽然不太好,但至少你可以说“我告诉过你了”。

  • 相信你的用户...(继续阅读)!?!(等一下,我刚刚读过??!)...(捂脸)。先生是我一整天读过的最有趣的东西! (2认同)

Art*_*cto 1

如果该值永远不会改变,您可以使用const它来代替。否则,就无法满足您的限制(除了通过扩展在 PHP 中挂钩函数调用之外,但即使如此,您也需要将静态变量访问更改为函数调用;否则,您必须修补 PHP)。

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