Puis-je obtenir CONST définie sur une classe PHP?
J'ai plusieurs CONST définie sur certaines classes, et que vous souhaitez obtenir une liste d'entre eux. Par exemple:
class Profile {
const LABEL_FIRST_NAME = "First Name";
const LABEL_LAST_NAME = "Last Name";
const LABEL_COMPANY_NAME = "Company";
}
Est-il possible d'obtenir une liste de la CONST définie sur le Profile
classe? Aussi loin que je peux dire, l'option la plus proche(get_defined_constants()
) ne suffit pas.
Ce que j'ai réellement besoin est une liste des noms de constantes - quelque chose comme cela:
array('LABEL_FIRST_NAME',
'LABEL_LAST_NAME',
'LABEL_COMPANY_NAME')
Ou:
array('Profile::LABEL_FIRST_NAME',
'Profile::LABEL_LAST_NAME',
'Profile::LABEL_COMPANY_NAME')
Ou encore:
array('Profile::LABEL_FIRST_NAME'=>'First Name',
'Profile::LABEL_LAST_NAME'=>'Last Name',
'Profile::LABEL_COMPANY_NAME'=>'Company')
Vous pouvez le faire à l'aide de réflexion. Recherche pour "Imprimer des constantes de classe" sur la page pour en voir un exemple.
L'aide de la Réflexion, et un ReflectionClass sur la Cl, vous pouvez utiliser la fonction getConstants nz.php.net/manual/en/class.reflectionclass.php
Réflexion sera votre sauveur.
L'aide de la Réflexion, et un ReflectionClass sur la Cl, vous pouvez utiliser la fonction getConstants nz.php.net/manual/en/class.reflectionclass.php
Réflexion sera votre sauveur.
OriginalL'auteur Brock Boland | 2009-06-05
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser La réflexion pour cela. Notez que si vous faites beaucoup de fois vous souhaitez peut-être à la recherche à la mise en cache du résultat.
De sortie:
Profile
peut être utilisé comme argument pour le réflecteur constructeur, sans les guillemets (un simple nom de la classe); en second lieu, pour être parfaitement clair, le tableau résultant de l'clés sont des chaînes de caractères, pas des constantes comme la mise en forme ici pourraient être prises afin de suggérer. (Bon de mentionner que le fn est sans-papiers.)XVI En 5.3 si vous avez des avis activée, vous ne serez pas en mesure d'utiliser
Profile
sans les guillemets, comme il affichera l'erreur suivante: remarque: l'Utilisation de undefined constant Profil - supposé "Profil". Je suggère donc de garder les guillemets'Profile'
Il est bon de définir des constantes liées à la logique à l'intérieur de la classe, de sorte que vous n'avez pas besoin de coder en dur argument du constructeur, mais l'utilisation
__CLASS__
à la place.new ReflectionClass(Profile::class)
fonctionne très bien aussiOriginalL'auteur Tom Haigh
Cette
Probablement parce qu'il n'est guère nécessaire. L'OP peut vouloir effectuer un méta-configuration par la mise en
types
commeall constants this class has
, qui dans la plupart des cas, et dans mon accordée limité avis, sont probablement mieux servi avec héritage ou d'un tableau statique de la variable avec les types (en laissant la place pour les constantes avec d'autres significations d'usage).OriginalL'auteur Wrikken
Utilisation token_get_all(). À savoir:
De sortie:
+1, même si je dirais que c'est un excellent moment pour utiliser la Réflexion comme mentionné par d'autres affiches, il est également important de comprendre le fonctionnement "sous le capot" et être en mesure de le faire sans eux ou de les reproduire si nécessaire. Bon spectacle.
Si vous ne voulez pas que votre classe soit chargé en mémoire, token_get_all est une alternative fantastique. C'est BEAUCOUP plus rapide que la Réflexion et ne pas encombrer la mémoire du processus si vous avez besoin de le faire avec beaucoup de classes.
+1 pour le jeton à base de solution! La compréhension de jeton en fonction de l'analyse est un plaisir compte tenu de la performance ... et comme toujours, il est une grande personne qui montre comment analyser les constantes via token_get_all(). Merci beaucoup!
Sans doute cela agit sur le seul fichier seul, et de ne pas hériter de toutes les constantes de classes parentes. En fait, cette technique ne se soucient même pas de la classe, il vous donnera toutes les constantes dans le fichier, même dans la portée globale. C'est un excellent outil pour explorer.
OriginalL'auteur cletus
Par le PHP docs commentaires, si vous êtes en mesure d'utiliser le ReflectionClass (PHP 5):
La Source est ici.
OriginalL'auteur mway
En PHP5, vous pouvez utiliser la Réflexion: (manuel de référence)
OriginalL'auteur Parsingphase
À l'aide de ReflectionClass et
getConstants()
donne exactement ce que vous voulez:De sortie:
OriginalL'auteur Ben James
Ouais, vous utilisez la réflexion. Chercher à la sortie de
Qui devrait vous donner l'idée de ce que vous serez à la recherche à.
OriginalL'auteur chaos
Il est utile d'avoir une méthode à l'intérieur de la classe pour retourner ses propres constantes.
Vous pouvez le faire de cette façon:
OriginalL'auteur Luis Siquot
Caractéristique statique de la méthode à la rescousse
Ressemble, c'est un endroit agréable pour l'utilisation des Traits avec une fonction statique pour étendre les fonctionnalités de classe. Traits de caractère nous permettent également de mettre en œuvre cette fonctionnalité dans une autre classe sans avoir à réécrire le même code (rester SEC).
Utilisez notre coutume "ConstantExport" Trait dans le Profil de la classe. Le faire pour toutes les classes que vous avez besoin de cette fonctionnalité.
EXEMPLE D'UTILISATION
SORTIES:
OriginalL'auteur DevWL
Pourquoi ne pas les mettre dans une variable de classe dans un tableau pour commencer? Facilite la boucle à travers.
Car les tableaux ne sont pas des constantes? Si vous mettre en place quelque chose qui est censé être une constante, une variable, alors vous risquez d'obtenir, par inadvertance, modifiée ou annulée. En d'autres termes, vous ne pouvez pas compter sur eux restant constants.
OriginalL'auteur Detect
Éventuellement avec des espaces de noms:
OriginalL'auteur revoke
OriginalL'auteur Юрий Светлов