2011-06-19 5 views
3

Serait-il possible d'importer namespaces en utilisant une variable comme ceci:Importation namespaces variables

$namespace = 'User\Authorization\Certificate'; 
use $namespace; 

Évidemment, cela ne fonctionnera pas comme déclaration use attend une constante, mais est-il une solution?

Edit: Découvert un bijou (uniquement en PHP> 5.3): class_alias($namespace, alias); qui fait à peu près la même chose avec use User\Authorization\Certificate as alias; donc vont utiliser cela.

+1

Je me demande ce que vous essayez d'obtenir. – hakre

+0

Eh bien, je combine les instructions require_once et use dans une fonction d'importation (..) à l'aide d'une hiérarchie de classes et de dossiers très structurée. –

+0

Est-il important de modifier le contenu des fichiers dont vous avez besoin à la volée pour introduire votre espace de noms? – hakre

Répondre

2

Bien qu'il soit impossible de passer un espace de noms dans une variable à use, vous pouvez lieu l'espace de noms et le nom de la classe attendue « courte » dans une variable et l'utiliser dans la plupart des endroits où vous auriez besoin , comme appeler new.

$namespace = '\foo\bar'; 
$class = 'baz'; 
$fully_qualified = $namespace . '\\'. $class; // \foo\bar\baz 
$a_foo_bar_baz = new $fully_qualified(...); 
var_dump($a_foo_bar_baz instanceof $fully_qualified); // true 
+1

Je suis allé avec la fonction class_alias (..) qui est à peu près ce que vous essayez de faire atteindre dans le code si belle solution. –

0

Non, PHP s'attend à ce que use suive un espace de noms, pas une expression (qui ne comprend pas de constante). Voir Using namespaces: Aliasing/Importing. Cependant, si vous modifiez le code PHP à la volée avant de l'exécuter dans une sorte d'agrégation ou de compilation au sein de votre système, vous pouvez remplacer le texte par des données variables qui paraissent assez statiques pour PHP.

Mais je n'ai aucune idée si votre système est capable de le faire. Je pourrais imaginer quelques stream wrapper ou stream filter le faisant à la volée. Il pourrait prendre en charge de façon transparente l'insertion du nom de l'espace de noms des variables.

+0

changer les fichiers .php à la volée, peut entraîner qu'il est tronqué à 0 octets si on y accède simultanément par plus d'un utilisateur, ou quelque chose comme ça ... je me souviens avoir une expérience terrible avec mes bases de données .txt + L'hébergement MySQL était si rare que vous deviez payer pour cela. –

+0

Je ne pense pas que cela s'applique. Si c'est le cas, ce serait déjà un problème pour le strict require/include. Changer sur le fichier n'a pas besoin de sauvegarder le fichier à nouveau. – hakre

+0

vous vouliez charger le fichier .php, en changeant le texte, puis en utilisant 'eval()'? –