2011-03-23 193 views
1

嘿,我有这样的如何在一个类中声明公共变量变量

class derp{ 

public $$ini; 

public static function regIni($ini){ 

derp::$$ini = 'test'; 

} 

} 

然后在另一个文件中我有

core::regIni('register'); 

然后在其他地方我用

core::$register; 

这产生了一个错误

public $$ini 

无效代码,但如果我离开它没有我不能设置

core::$$ini 

我该如何解决这个问题?

请注意$$ ini是一个变量变量,意思是$ ini的值是变量名,所以$ ini ='registry'then $$ ini actualy表示$ registry。

+1

'公共静态$ ini'? – 2011-03-23 13:10:10

+0

这是不可行的。静态属性只能在解析阶段定义。 “ReflectionProperty”或“ReflectionClass :: setStaticPropertyValue”和“runkit_ *”函数目前都无法(打算)创建静态类属性。抱歉。 – mario 2011-03-23 14:27:27

+0

@mario感谢您的明确意见,如果可以的话,我会把它作为公认的答案。我geuss我将不得不放弃静态类,使一个正常的。 – Robin 2011-03-23 14:37:53

回答

1

所以,这不是一个过分热情的回答,因为我可以断定,它目前是不可能的。

  • 例如,您不能定义new ReflectionProperty("derp", "static_prop")并附加它。这只是为了反思。
  • $c = new ReflectionClass("derp");$derp->setStaticPropertyValue("p", 123);也无法正常工作。这些属性还需要进行预定义。
  • 最后,runkit_* functions也不能帮助完成此任务。它们主要用于改变方法。
  • classkit相同。

我不知道其他这样的PECL扩展,但那不会作为一般解决方案有用。所以对于当前的PHP版本,在解析阶段之后不能添加静态类属性。

3

为什么不使用访问方法来设置和获取类数据?

class derp { 

    protected static $_data = array(); 

    public static function regIni($ini, $value) { 
     derp::$_data[$ini] = $value; 
    } 

    public static function getIni($ini, $default = NULL) { 
     return isset(derp::$_data[$ini]) ? derp::$_data[$ini] : $default; 
    } 
} 
+0

+1为了击败我,我最终首先尝试了魔法方法,结果却意识到它们不适合静态。 – 2011-03-23 13:29:44

+0

所以现在这将是derp:getIni('register')它现在如果注册将是一个类现在我将不得不去$ class = derp :: getIni('register'),然后$ class-> function(); ?这对我的问题来说并不是真正的问题,只是一个不同的解决方案,我仍然不能为这个类动态地创建变量。 – Robin 2011-03-23 13:31:36

+0

现在你可以使用'derp :: setIni('register','some value');'和'$ register = derp :: getIni('register');'。 – biakaveron 2011-03-23 13:47:19

0

看看魔术方法__set和__get

+0

他们真的用静态工作吗? – 2011-03-23 13:26:31

+0

你说得对,好像他们不用静电工作,对不起。 – julioc 2011-03-23 13:27:37

+0

从PHP 5.3.0开始,如果其中一个魔术重载方法被声明为静态,则会发出警告。 – 2011-03-23 13:28:14

0

马里奥说:

这是不可行的。静态属性 只能在解析阶段定义。 ReflectionProperty或 ReflectionClass :: setStaticPropertyValue, 也没有runkit_ *函数当前是 有能力(打算)创建静态 类属性。对不起

盖斯斯我是为解决这个问题而工作的。 做了数组$ ini和加载的值到有DERP:$ INI [ '基地'] [ '关键']

感谢您的帮助,

罗宾