2012-08-23 13 views
5

Tengo una pregunta respecto a la "dinámica" de inicialización de clase, permítanme explicar lo que quiero decir:

$class = 'User'; 
$user = new $class(); 

//...is the same as doing 
$user = new User(); 

Así que ... ese no es el problema, pero estoy teniendo algunos problemas haciendo lo mismo al llamar a una variable estática de una clase, por ejemplo:

$class = 'User'; 
print $class::$name; 

¿Qué da el siguiente error:

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in

Por supuesto que lo he probado haciendo print User::$name; y eso funciona. Entonces la clase funciona

¿Por qué es esto y hay una forma de evitarlo?

Seguimiento pregunta:
También hay razones válidas para no utilizar esta forma "dinámica" en la creación de clases?

+0

no puede mezclar llamadas dinámicas y estáticas, es por eso que es imposible llamar a User :: $$ prop y también su $ class :: $ name –

+0

http://stackoverflow.com/questions/3679717/unexpected-t -paamayim-nekudotayim-on-one-computer-but-not-another-with-php-5 –

+1

posible duplicado de [Acceso a una variable estática por $ var :: $ referencia] (http://stackoverflow.com/questions/ 675676/access-a-static-variable-by-varreference) –

Respuesta

1

Si no tienen versión de PHP 5.3 y superior, y no desea utilizar la reflexión (que en mi opinión es una exageración, a menos que quiera acceder a múltiples propiedades estáticas) puede definir la función getter y llamarla a través de call_user_func():

class A { 
    public static $var = "Hello"; 
    public static function getVar() { 
     return self::$var; 
    } 
} 
$className = "A"; 
echo call_user_func(array($className, 'getVar')); 
+0

Bueno, eso es sin duda una forma de solucionar el problema ... ¡Gracias! – jamietelin

+0

Parece una solución aún más fácil; '$ vars = get_class_vars ($ className);' – jamietelin

2

Este código funciona bien en PHP 5.4.3:

<?php 

class A { 
    public static $var = "Hello"; 
} 

print(A::$var); 

$className = "A"; 
print($className::$var); 

?> 
+2

También funciona en 5.3.2 –

+2

Este es el código que tiene el OP. Es de suponer (aunque no ha declarado) que debe estar utilizando una versión anterior de PHP. –

+1

Bueno, entonces sé que es mi versión de PHP el problema. :) ¡Gracias! – jamietelin

2

Esta es la respuesta a la pregunta que he vinculado en los comentarios:

You can use reflection to do this. Create a ReflectionClass object given the classname, and then use the getStaticPropertyValue method to get the static variable value.

class Demo 
{ 
    public static $foo = 42; 
} 

$class = new ReflectionClass('Demo'); 
$value=$class->getStaticPropertyValue('foo'); 
var_dump($value); 
+0

usando reflexión parece ser una solución exagerada a menos que tenga la intención de usarlo en un gran número de propiedades de clases estáticas, pero sí, utilizando la reflexión obtendrá el resultado necesario –

+1

También, suena por el mensaje de error que OP está utilizando una versión de php antes de cualquier versión (5.3.something) que tenga soporte adecuado para clases estáticas y variables de clases estáticas y como tal esta puede ser la mejor opción. –

+0

¿Cuáles son las diferencias reales aquí solo al crear la clase "real" y luego obtener mi variable? Me gusta: '$ user = new $ class(); imprimir $ usuario-> nombre; '? ¿Hay algún beneficio de rendimiento al usar Reflection? – jamietelin

Cuestiones relacionadas