est-il possible d'obtenir la liste des espaces de noms définis
SALUT à tous,
Je me demandais si il existe un moyen en php 5.3+ pour obtenir une liste des espaces de noms définis au sein d'une application.
donc
si
file 1 has namespace FOO
et
file 2 has namespace BAR
Maintenant, si je comprend le fichier 1 et fichier 2 fichier 3 aimerai savoir avec une sorte d'appel de la fonction de l'espace de nom FOO et BAR sont chargés.
Je veux réaliser ce pour être sûr d'un module dans mon application est chargée avant de vérifier si la classe existe ( avec is_callable ).
Si ce n'est pas possible, je voudrais savoir si il existe une fonction pour vérifier si un espace de noms spécifique est définie comme is_namespace().
Espère que vous avez l'idée. et ce que je suis en train de réaliser
- En bref, la réponse est non. Il n'y a pas de php façon de le faire. Bâton avec class_exists ou is_callable.
- Peno, déteste le dire, mais comme vous pouvez le voir ci-dessous il y a un moyen pour obtenir le chargé de noms de.
- Désolé, mais je parlais de le faire directement en PHP. Comme dans, une fonction pour vérifier si un espace de noms en cas de déclaration/en cours d'utilisation. Désolé si je n'étais pas assez claire.
- Peno, pas de problème , mais je crois qu'il n'est plus dans la programmation que les fonctions d'un langage.Penser hors de la boîte, comme la fonction ci-dessous est un bon exemple. 🙂 vous où à droite sur
is_callable
bien 🙂
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, pour voir si un groupe existe, utilisé
class_exists
.Deuxièmement, vous pouvez obtenir une liste de classes avec l'espace de noms à l'aide de
get_declared_classes
.Dans le cas le plus simple, vous pouvez l'utiliser pour trouver un espace de noms correspondant de déclarer tous les noms de classe:
Un autre exemple, le script suivant génère un tableau hiérarchique de la structure de l'déclaré espaces de noms:
Donne:
Je sais que cette question a déjà une réponse, mais je voulais offrir une solution plus réaliste à ce que je crois est ton problème. Si j'en avais eu plus de temps, hier, quand j'ai fait mon commentaire je l'aurais posté ce. Désolé de ne pas.
Il sonne comme l'OP a un système de modules qu'il a besoin de savoir si un module est chargé avant d'autoriser un appel à elle.
Tout d'abord, je tiens à dire que l'utilisation d'espaces de noms simplement de déclarer les modules actif est, à l'OMI, en abusant de ce qu'ils sont pour. Si vous suivez le but de namespacing à la lettre, votre structure pourrait ressembler à ceci:
L'ensemble de votre système doit être dans son propre espace de noms. Appelons cela de l'espace de noms
System
. Ensuite, les modules serait susceptible d'être sous laSystem\Module
espace de noms. Ensuite, en fonction de la complexité, il serait possible que chaque module peut avoir un espace de noms, sousSystem\Module
. La prise de vos exemples,System\Module\FOO
etSystem\Module\BAR
.Maintenant, nous allons obtenir en faisant un système de modules qui s'inscrit lui-même en charge.
Tout d'abord, nous avons besoin d'un endroit pour s'inscrire à. Disons que
System\Module\Registry
et, depuis, il y a probablement beaucoup de différents registres, il permettra de mettre en œuvre lesSystem\iRegistry
. Par souci de concision, je suis le seul à posterSystem\Module\Registry
. Selon toute vraisemblance, il mettra également en œuvre une sorte de cohérence globale du modèle, comme un singleton, mais je ne suis pas en montrant que ce soit. Ici, il est:Maintenant, dans chaque module, vous devez appeler cette fonction registre lorsque le fichier est chargé. Il ya un couple de façons de le faire. La première est d'avoir un peu de code dans votre module de noms qui s'exécutent sur la charge similaire à typique proceedural code:
Ci-dessus signifierait la duplication de code si. Vous pouvez également utiliser autoload pour ce lieu, de cette façon, le "enregistrement" de code est tous en un seul endroit. Voici un concept de base de le faire:
Une autre façon de le faire serait de définir une interface pour modules avec une fonction spécifique pour l'enregistrement lorsque le module est initialisé. Toutefois, cela signifie que le module doit être chargé en premier, et risquent de provoquer les problèmes en fonction de vos besoins.
Après avoir fait cela: