首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP:类中的静态只读属性

问PHP:类中的静态只读属性
EN

Stack Overflow用户
提问于 2011-12-07 17:47:47
回答 3查看 5K关注 0票数 9

大家好!

我的问题是:我需要为类中的静态变量重载标准get和set…但是php没有提供这样的功能...它是在2008年提出的,但仍然没有实现……只读的情况也是如此。

我的问题是:有没有一种方法可以让静态属性可以从外部读取,但又不会被修改?

代码语言:javascript
复制
echo aaa::$qwe; //<--- echoes value of $qwe
aaa::$qwe = '666'; //<--- throws an error because variable is protected from modification

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

也许有一些变通的方法?

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

EN

回答 3

Stack Overflow用户

发布于 2011-12-07 18:04:38

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

代码语言:javascript
复制
const QWE = '666';

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

  1. 使用Getter

私有函数;公共函数getQwe() {$qwe$setQwe->qwe;}受保护函数setQwe($value) { $this->qwe = $value;}

我不太喜欢它们(“属性定义状态,而不是行为,就像方法一样”)。你得到的额外方法总是比属性多一倍,如果你有很多属性,这将极大地破坏你的类。然而,这是我所能看到的实现你想要实现的唯一方法。

  • 信任你的用户;)注释你的属性,并说类似于“如果你改变这个值,可能会有东西坏掉,这是你自己的错”。

/** * QWE **此属性应视为"readonly“。如果你改变这个值,一些可怕的事情会发生在你身上。** @readonly * @var string */公共$qwe = '666';

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

票数 4
EN

Stack Overflow用户

发布于 2011-12-07 17:57:33

如果该值从未更改,则可以改用const。否则,就没有办法满足您的限制(除了通过扩展挂钩PHP中的函数调用,但即使这样,您也需要将静态变量访问更改为函数调用;否则,您必须修补PHP)。

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

票数 1
EN

Stack Overflow用户

发布于 2013-04-18 05:55:33

这就简单了一点:

代码语言:javascript
复制
class aaa{
private static $qwe='rty';
public static function qwe() { return self::$qwe; }
}

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

代码语言:javascript
复制
aaa::$qwe = 'something'; // fails
echo aaa::qwe(); // success

我知道这不是很理想,但是你可以做一个全部替换

代码语言:javascript
复制
aaa::$qwe 

使用

代码语言:javascript
复制
aaa::qwe()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8413275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档