nombre - php namespace include
Espacio de nombres PHP con nombre de clase dinĂ¡mico (2)
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.
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 objetos 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 al modelo de objeto básico global en el espacio de nombres global y lo uso de esta manera de manera confiable 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 manera diferente o porque las llamadas dinámicas para los espacios de nombres no se hayan implementado en este señorío todavía, 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?
Bueno, solo deletrea 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 secundario (como se indica en los comentarios), simplemente anteponga el espacio de nombres con __NAMESPACE__
:
$class = __NAMESPACE__ . ''//Editor//' . $definition;
Entonces, si el espacio de nombres actual es /Foo/Bar
, y $definition
es "Baz", la clase resultante sería /Foo/Bar/Editor/Baz
$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
}
}