Przestrzeń nazw PHP z dynamiczną nazwą klasy

Zastanawiam się, czy ktoś jeszcze napotkał ten problem podczas korzystania z nowej zdolności do klas przestrzeni nazw za pomocą PHP 5.3.

Generuję dynamiczne wywołanie klasy wykorzystujące oddzielną klasę do definiowania typów użytkowników w mojej aplikacji. Zasadniczo definiator klasy pobiera całkowitą reprezentację typów i interpretuje je, zwracając łańcuch zawierający nazwę klasy, który ma być wywołany jako model dla tego użytkownika.

Mam model obiektowy dla typu użytkownika z nazwa ta zdefiniowana jest w obszarze globalnym, ale mam inny obiekt o tej samej nazwie dla edytora użytkownika w przestrzeni nazw edytora. Z jakiegoś powodu, PHP nie pozwoli mi wykonać dynamicznego wywołania w przestrzeni nazw w następujący sposób.

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

Identyczna składnia działa do wywołania globalnego podstawowego modelu obiektowego w globalnej przestrzeni nazw i używam go w ten sposób niezawodnie w całej aplikacji.

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

To poprawnie wywoła dynamicznie żądaną klasę.

Czy Jest jakiś powód, dla którego te dwa czy zachowywałoby się inaczej, czy też dynamiczne wywołanie przestrzeni nazw nie zostało jeszcze zaimplementowane w tym manorze, ponieważ jest to nowa funkcja? Czy istnieje inny sposób dynamicznego wywoływania klasy z innej przestrzeni nazw bez jawnego umieszczania jej nazwy w kodzie, ale z wewnątrz zmiennej?

Author: hakre, 2010-12-22

1 answers

Dobrze, po prostu przeliteruj przestrzeń nazw w łańcuchu:

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

A jeśli jest to dziecięca przestrzeń nazw( jak wskazano w komentarzach), po prostu dodaj przestrzeń nazw __NAMESPACE__:

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

Więc jeśli bieżąca przestrzeń nazw to \Foo\Bar, A $definition to "Baz", Klasa wynikowa to \Foo\Bar\Editor\Baz

 80
Author: ircmaxell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-05 18:33:21