web-dev-qa-db-fra.com

PHP espace de noms avec nom de classe dynamique

Vous vous demandez si quelqu'un d'autre a rencontré ce problème lors de l'utilisation de la nouvelle capacité de nommer des classes en utilisant PHP 5.3.

Je génère un appel de classe dynamique en utilisant une classe distincte pour définir les types d'utilisateurs dans mon application. Fondamentalement, le définisseur de classe prend une représentation entière des types et les interprète, renvoyant une chaîne contenant le nom de classe à appeler comme modèle pour cet utilisateur.

J'ai un modèle d'objet pour le type d'utilisateur avec ce nom défini dans la portée globale, mais j'ai un autre objet avec le même nom pour l'éditeur de l'utilisateur dans l'espace de noms de l'éditeur. Pour une raison quelconque, PHP ne me permettra pas de faire un appel dynamique avec espace de noms comme suit.

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

La syntaxe identique fonctionne pour appeler le modèle d'objet global de base dans l'espace de noms global et je l'utilise de cette manière de manière fiable dans toute l'application.

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

Cela appellera correctement la classe souhaitée dynamiquement.

Y a-t-il une raison pour laquelle les deux se comporteraient différemment, ou des appels dynamiques pour les espaces de noms n'ont pas encore été implémentés dans ce manoir, car il s'agit d'une nouvelle fonctionnalité? Existe-t-il une autre façon d'appeler dynamiquement une classe à partir d'un autre espace de noms sans placer explicitement son nom dans le code, mais à partir d'une variable?

36
DeaconDesperado

Eh bien, écrivez simplement l'espace de noms dans la chaîne:

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

Et s'il s'agit d'un espace de noms enfant (comme indiqué dans les commentaires), ajoutez simplement l'espace de noms avec __NAMESPACE__:

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

Donc, si l'espace de noms actuel est \Foo\Bar, et $definition est "Baz", la classe résultante serait \Foo\Bar\Editor\Baz

76
ircmaxell