2010-12-22 21 views
31

Preguntándose si alguien más ha encontrado este problema al utilizar la nueva capacidad de clases de espacio de nombres usando PHP 5.3.Espacio de nombres PHP con nombre de clase dinámico

Estoy generando una llamada de clase dinámica utilizando una clase separada para definir tipos de usuario en mi aplicación. Básicamente, el definidor de clases toma una representación entera de tipos y los interpreta, devolviendo una cadena que contiene el nombre de clase que se llamará como modelo para ese usuario.

Tengo un modelo de objeto para el tipo de usuario con ese nombre definido en el ámbito global, pero tengo otro objeto con el mismo nombre para el editor del usuario en el espacio de nombres del Editor. Por alguna razón, PHP no me permitirá hacer una llamada dinámica de espacio de nombres de la siguiente manera.

$definition = Definer::defineProfile($_SESSION['user']->UserType); 
new \Editor\$definition(); 

La sintaxis idéntica funciona para llamar el modelo de objetos básica global en el espacio de nombres global y lo uso de esta forma de manera fiable en toda la aplicación.

$definition = Definer::defineProfile($_SESSION['user']->UserType); 
new $definition(); 

Esto llamará correctamente a la clase dinámica deseada.

¿Hay alguna razón por la que los dos se comporten de forma diferente, o las llamadas dinámicas para los espacios de nombres no se han implementado en esta casa aún, ya que esta es una característica nueva? ¿Hay alguna otra manera de llamar dinámicamente una clase desde otro espacio de nombres sin colocar explícitamente su nombre en el código, sino desde dentro de una variable?

+0

Yo usaría eval() para eso – yoda

Respuesta

64

Bueno, sólo deletrear el espacio de nombres en la cadena:

$definition = Definer::defineProfile($_SESSION['user']->UserType); 
$class = '\\Editor\\' . $definition; 
$foo = new $class(); 

Y si se trata de un espacio de nombres del niño (como se indica en los comentarios), simplemente se antepone el espacio de nombres con __NAMESPACE__:

$class = __NAMESPACE__ . '\\Editor\\' . $definition; 

Entonces, si el espacio de nombre actual es \Foo\Bar, y $definition es "Baz", la clase resultante sería \Foo\Bar\Editor\Baz

+3

Funcionó perfectamente. Me da un error épico por no pensar en agregar esto a la cadena. ¡Gracias! – DeaconDesperado

+0

No hay problema (he intentado con el mismo problema anteriormente) ... – ircmaxell

+0

O no se escape el '\\' para una mejor legibilidad. EN MI HUMILDE OPINIÓN. LOL Markdown no funciona solo con una barra inclinada invertida: '\' o una barra invertida escapada: '\\' (¡vaya, está muy mal!) – Rudie

-3
$url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : null; 
$url = explode('/', rtrim($url, '/')); 

class Dispatcher { 
    public static function dispatch() { 
     global $url; // 
     if (empty($url[0])) { 
      $url[0] = "Index"; 
      $url[1] = "main"; 
     } 
     $class = '\\Controller\\' .$url[0]; 
     $controller = new $class(); //Index Class 
     $controller->$url[1](); //This Class Main Method 
    } 
} 
Cuestiones relacionadas