2013-02-02 10 views
5

Ich brauche für Zugang zu dieser Klasse statische Eigenschaft als Klassenname Konstante zu verwenden, das heißtVerwenden Konstante als Klassenname

class a { 

    public static $name = "Jon"; 

} 

define("CLASSNAME", "a"); 

echo CLASSNAME::$name; 

dieser Fehler zurückgibt, dass Klasse CLASSNAME existiert nicht. Es gibt eine Lösung?

+1

Gute Frage. Hmm. – Prash

+0

Vielleicht, wenn Sie angeben, was Sie eigentlich tun möchten, könnte es einige bessere alternative Möglichkeiten geben. Dies kann ein [XY-Problem] sein (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) –

Antwort

4

Es ist möglich, mit Reflexion:

class a { 

    public static $name = "Jon"; 

} 

define("CLASSNAME", "a"); 

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

Wenn es ein gutes Design Wahl ist eine andere Frage ...

+0

ja, es funktioniert. – ripa

0

PHPs absolute Chaos von dereferencing:

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

Ich war auf der Suche in dieses Problem, weil die Klasse auf einem bestimmten Kontext basiert, der gegeben werden muss. Also habe ich eine Funktion in meiner Klasse, die die Klasse, die Sie wie so benötigen zurück:

/** 
* 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; 
} 

Daher können Sie es aufrufen, indem $class = new $this->getClass(static::CLASSNAME); verwenden, wenn Sie in der aktuellen Klasse eine Konstante definiert, die den Namen der Klasse hält Sie möchte instanziieren. In Ihrem Fall können Sie es ohne die 'static::' oder mit welcher Variable Sie verwenden möchten. Vergessen Sie nicht, eine Fehlerbehandlung zu implementieren.