9

今天是个好日子!

我的问题是:我需要为类中的静态变量重载标准获取和设置......但 php 中没有提供这样的功能......它在 2008 年被问及仍未实现......只读......

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

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

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

也许有一些解决方法?

是的,我知道我可以让它像 aaa::Get('qwe') 但那不好......

4

3 回答 3

4

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

const QWE = '666';

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

  1. 使用吸气剂

    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';
    

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

于 2011-12-07T10:04:37.773 回答
1

这有点容易:

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()
于 2013-04-17T21:55:33.117 回答
1

如果值永远不会改变,你可以使用const。否则,将无法满足您的限制(没有通过扩展在 PHP 中挂钩函数调用,但即便如此,您也需要更改对函数调用的静态变量访问;否则,您必须修补 PHP)。

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

于 2011-12-07T09:57:33.060 回答