Php 使用常量作为类名

Php 使用常量作为类名,php,language-construct,Php,Language Construct,我需要使用常量作为访问此类静态属性的类名,即 class a { public static $name = "Jon"; } define("CLASSNAME", "a"); echo CLASSNAME::$name; 这将返回错误,该类CLASSNAME不存在。 有一些解决方案吗?使用PHP的绝对混乱的解引用: $CLASSNAME = 'a'; $a::$name; 通过反射,这是可能的: class a { public static $name = "

我需要使用常量作为访问此类静态属性的类名,即

class a {

    public static $name = "Jon";

}

define("CLASSNAME", "a");

echo CLASSNAME::$name;
这将返回错误,该类
CLASSNAME
不存在。
有一些解决方案吗?

使用PHP的绝对混乱的解引用:

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

通过反射,这是可能的:

class a {

    public static $name = "Jon";

}

define("CLASSNAME", "a");

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

如果它是一个好的设计选择是另一个问题…

我正在研究这个问题,因为这个类是基于必须给出的特定上下文的。因此,我在类中创建了一个函数,它将返回您所需的类,如下所示:

/**
 * 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::
”或任何您想要使用的变量的情况下使用它。不要忘记实现一些错误处理。

如果您陈述了您真正想要做的事情,可能会有更好的替代方法。这可能是一个更新:从PHP7,您只需执行:
echo(CLASSNAME)::$name