2013-02-02 22 views
5

我需要使用的类名常数存取权限这一类的静态属性,即使用常数作为类名

class a { 

    public static $name = "Jon"; 

} 

define("CLASSNAME", "a"); 

echo CLASSNAME::$name; 

这个返回错误,该类CLASSNAME不存在。 有一些解决方案?

+1

好问题。嗯。 – Prash

+0

也许如果你说出你真正想做的事情,可能会有一些更好的替代方法。这可能是[XY问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) –

回答

4

有可能与反思:

class a { 

    public static $name = "Jon"; 

} 

define("CLASSNAME", "a"); 

$obj = new ReflectionClass(CLASSNAME); 
echo $obj->getStaticPropertyValue("name"); 

如果它是一个不错的设计选择是另外一个问题...

+0

是的,它的工作。 – ripa

0

使用PHP的提领的绝对混乱:

$CLASSNAME = 'a'; 
$a::$name; 
0

我一直在寻找进入这个问题,因为这个类是基于必须给定的某个上下文。所以我改变了我的类中的函数将返回你需要像这样的类:

/** 
* Instantiate a class by class name in variable 
* 
* @param string $className The name of the class 
* @return mixed The instantiated class 
*/ 
protected function getClass($className) 
{ 
    return new $className; 
} 

因此,你可以通过使用$class = new $this->getClass(static::CLASSNAME);当你持有类的名字当前类中定义的常量调用它,你想要实例化。在你的情况下,你可以使用它,而不用'static::'或任何你想使用的变量。不要忘记实施一些错误处理。