大家好日子!
我的问题是:我需要在类中重载标准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'),但这并不好......
答案 0 :(得分:4)
直接回答您的问题:不,您不能将常规属性标记为只读。如果你想设置原始类型(array
除外),那将永远不会改变,你应该使用常量
const QWE = '666';
这对于对象和数组不起作用。我看到两个(让我们说)“解决方案”
使用Getter
private $qwe;
public function getQwe() { return $this->qwe; }
protected function setQwe($value) { $this->qwe = $value; }
我不太喜欢它们(“属性定义状态,而不是行为,就像方法一样”)。你总是得到两倍于属性的额外方法,如果你有很多属性,这将极大地炸毁你的课程。但是,据我所知,实现你想要实现的目标只是唯一的方法。
信任您的用户;)评论您的财产并说出“如果您更改此值,可能会出现问题并且您自己的错误”。
/**
* 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()