Del nombre de la cadena de una clase, ¿puedo obtener una variable estática?

Dado el nombre de la cadena de una clase en PHP, ¿cómo puedo acceder a una de sus variables estáticas?

Lo que me gustaría hacer es esto:

$className = 'SomeClass'; // assume string was actually handed in as a parameter $foo = $className::$someStaticVar; 

… pero PHP me da un encantador “Error de parse: error de syntax, inesperado T_PAAMAYIM_NEKUDOTAYIM”, que aparentemente es un nombre hebreo para los dos puntos dobles (: :).

Actualización: Desafortunadamente, tengo que usar PHP 5.2.X para esto.

Actualización 2: como adivinó MrXexxed, la variable estática se hereda de una clase padre.

La reflexión lo hará

Un compañero de trabajo me acaba de enseñar cómo hacer esto con la reflexión, que funciona con PHP 5 (estamos en 5.2), así que pensé en explicarlo.

 $className = 'SomeClass'; $SomeStaticProperty = new ReflectionProperty($className, 'propertyName'); echo $SomeStaticProperty->getValue(); 

Ver http://www.php.net/manual/en/class.reflectionproperty.php

Un truco similar funciona para los métodos.

 $Fetch_by_id = new ReflectionMethod($someDbmodel,'fetch_by_id'); $DBObject = $Fetch_by_id->invoke(NULL,$id); // Now you can work with the returned object echo $DBObject->Property1; $DBObject->Property2 = 'foo'; $DBObject->save(); 

Ver http://php.net/manual/en/class.reflectionmethod.php y http://www.php.net/manual/en/reflectionmethod.invoke.php

¿Qué versión de PHP estás ejecutando? Creo que por encima de 5.3.x esto está permitido pero antes no es así.

EDITAR: aquí tienes desde PHP 5.3.0 está permitido Ejemplo # 2

 echo $classname::doubleColon(); // As of PHP 5.3.0 

Editar: para uso de variables

 echo $classname::$variable; // PHP 5.3.0 + 

aquí está el enlace

Edición 3: Pruebe este enlace, la respuesta de allí parece que se aplicaría a su situación.

Eso solo es posible en PHP 5.3 y posterior con enlaces estáticos tardíos .

La solución para las versiones anteriores de PHP que primero me viene a la mente es, por favor, no me lastimes, usando eval() :

 if (class_exists($className)) { eval('$foo = ' . $className . '::$someStaticVar;'); } 

Por cierto, al acceder a variables estáticas, se necesita $ antes del nombre de la variable, como en $someStaticVar .

Puede que tenga que usar las clases de reflexión. http://www.php.net/manual/en/reflectionfunctionabstract.getstaticvariables.php

O utilice una evaluación de cadena simple: print "{$className::$someStaticVar}" , que reemplaza $ className antes de buscar el :: $ someStaticVar. Sin embargo, no estoy seguro de PHP <5.2.