2011-12-07 57 views
7

大家好!PHP:静态只读属性类

我的问题是:我需要重载标准获取和类静态变量的设置...但在PHP中没有提供这样的功能...有人问在2008年,仍然没有实现......同去的只读...

我的问题:有没有一种方法,使静态属性入店从课外阅读,但是禁止修改?

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

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

也许有一些解决方法?

是的,我知道我可以把它像AAA ::获取(“QWE”),但没有好...

+2

为什么它不好? – Artefacto

+0

因为我需要更改2MB的现有代码库,也不干净,再加上还有其他原因不依赖于我:) – NewProger

+1

为什么不使用类常量?或者将变量内部修改? – mAu

回答

1

如果值不会改变,你可以使用const代替。 否则,没有办法满足您的限制(通过扩展来连接PHP中的钩子函数,但即使如此,您仍然需要将静态变量访问更改为函数调用;否则,您必须修补PHP)。

当然,这是非常令人怀疑你的应用程序正在做的是不错的设计。依赖于改变静态属性或多或少地依赖于全局变量。

+0

嗯,这就是我必须忍受的:)现有的代码库......不幸的是,我不能使用const,因为一些变量存储数组... – NewProger

+1

如果设计允许这样的改变,可以将数组保存为CSV,或者可能是JSON编码:'const $ qwe ='[“666”]'' – KingCrunch

+0

嗯,这实际上是有趣的想法! – NewProger

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

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

+0

只有选项2将是可能的:) 但是,留下非常重要的变量是不好的:) – NewProger

+0

相信你的用户...(继续阅读)!?(等一会儿dahell我只是读?!).. (Facepalm)。那个先生是我读过的最有趣的东西! – Sebastien

+0

@Sebastien我不知道......最有趣的部分是什么?你知道,对于“用户”,我的意思是其他开发人员而不是应用程序的访问者?而且你知道,如果他们“不值得信赖”,他们就会自己开枪。 ) – KingCrunch

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() 
+1

-1您不能在对象上下文中使用'$ this'。 – Leri

+0

谢谢Leri,将'$ this-> qwe;'中的第一个代码片段固定为'self :: $ qwe'。如果你觉得它更好,请重新评价我的答案。 –