164 votes

Puis-je obtenir des CONST's définis sur une classe PHP ?

J'ai plusieurs CONST définis sur certaines classes, et je veux en obtenir une liste. Par exemple :

class Profile {
    const LABEL_FIRST_NAME = "First Name";
    const LABEL_LAST_NAME = "Last Name";
    const LABEL_COMPANY_NAME = "Company";
}

Existe-t-il un moyen d'obtenir une liste des CONST définis sur le site Web de l'entreprise ? Profile classe ? Pour autant que je sache, l'option la plus proche ( get_defined_constants() ) ne fera pas l'affaire.

Ce dont j'ai besoin, en fait, c'est d'une liste des noms des constantes - quelque chose comme ceci :

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 même :

array('Profile::LABEL_FIRST_NAME'=>'First Name', 
    'Profile::LABEL_LAST_NAME'=>'Last Name',
    'Profile::LABEL_COMPANY_NAME'=>'Company')

0 votes

Vous pouvez le faire en utilisant réflexion . Cherchez "Print class constants" sur cette page pour voir un exemple.

0 votes

En utilisant Reflection, et une ReflectionClass sur Cl, vous pouvez utiliser la fonction getConstants nz.php.net/manual/fr/class.reflectionclass.php

0 votes

288voto

Tom Haigh Points 32314

Vous pouvez utiliser Réflexion pour ça. Notez que si vous faites cela souvent, vous pouvez envisager de mettre le résultat en cache.

<?php
class Profile {
    const LABEL_FIRST_NAME = "First Name";
    const LABEL_LAST_NAME = "Last Name";
    const LABEL_COMPANY_NAME = "Company";
}

$refl = new ReflectionClass('Profile');
print_r($refl->getConstants());

Sortie :

Array
(
    'LABEL_FIRST_NAME' => 'First Name',
    'LABEL_LAST_NAME' => 'Last Name',
    'LABEL_COMPANY_NAME' => 'Company'
)

4 votes

Deux remarques mineures : premièrement, au point 5.3, Profile peut être utilisé comme argument du constructeur du réflecteur, sans guillemets (un simple nom de classe) ; deuxièmement, pour être tout à fait clair, les clés du tableau résultant sont des chaînes de caractères, et non des constantes comme le formatage ici pourrait être pris pour suggérer. (Cela ne vaut la peine d'être mentionné que parce que la fn est sans-papiers .)

11 votes

@Benji XVI En 5.3, si vous avez activé les avis, vous ne pourrez pas utiliser Profile sans les guillemets, car il affichera l'erreur suivante : Notice : Use of undefined constant Profile - assumed 'Profile'. Je suggère donc de garder les guillemets 'Profile'

10 votes

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 l'argument du constructeur, mais d'utiliser la fonction __CLASS__ à la place.

23voto

Wrikken Points 37727

Ce site

 $reflector = new ReflectionClass('Status');
 var_dump($reflector->getConstants());

2 votes

+1 Ce serait le cas puisque je ne trouve aucune fonction procédurale PHP intégrée pour obtenir des constantes de classe, ce qui est un peu dommage.

1 votes

Probablement parce qu'il n'y en a guère besoin. L'OP pourrait vouloir faire une méta-configuration en définissant types comme all constants this class has Dans la plupart des cas, et selon mon opinion limitée, il est préférable d'utiliser soit l'héritage, soit un tableau statique de variables avec les types (laissant de la place pour des constantes avec d'autres significations/utilisations).

0 votes

En quoi cela est-il différent de la réponse acceptée postée en 2009 ?

18voto

cletus Points 276888

Utilisez token_get_all() . A savoir :

<?php
header('Content-Type: text/plain');

$file = file_get_contents('Profile.php');
$tokens = token_get_all($file);

$const = false;
$name = '';
$constants = array();
foreach ($tokens as $token) {
    if (is_array($token)) {
        if ($token[0] != T_WHITESPACE) {
            if ($token[0] == T_CONST && $token[1] == 'const') {
                $const = true;
                $name = '';
            } else if ($token[0] == T_STRING && $const) {
                $const = false;
                $name = $token[1];
            } else if ($token[0] == T_CONSTANT_ENCAPSED_STRING && $name) {
                $constants[$name] = $token[1];
                $name = '';
            }
        }
    } else if ($token != '=') {
        $const = false;
        $name = '';
    }
}

foreach ($constants as $constant => $value) {
    echo "$constant = $value\n";
}
?>

Sortie :

LABEL_FIRST_NAME = "First Name"
LABEL_LAST_NAME = "Last Name"
LABEL_COMPANY_NAME = "Company"

3 votes

+1, même si je dirais que c'est un excellent moment pour utiliser Reflection comme mentionné par d'autres posters, il est également important de comprendre les rouages "sous le capot" et de pouvoir s'en passer ou les reproduire si nécessaire. Bonne émission.

1 votes

Si vous ne voulez pas que votre classe soit chargée en mémoire, token_get_all est une alternative fantastique. Elle est BEAUCOUP plus rapide que Reflection et n'encombre pas la mémoire du processus si vous devez le faire avec de nombreuses classes.

0 votes

+1 pour la solution à base de jetons ! Comprendre l'analyse syntaxique basée sur les jetons est un plaisir compte tenu des performances ... et comme toujours, il y a une personne formidable qui montre comment analyser les constantes via token_get_all(). Merci beaucoup !

16voto

Parsingphase Points 382

En PHP5, vous pouvez utiliser Reflection : (référence manuelle)

$class = new ReflectionClass('Profile');
$consts = $class->getConstants();

13voto

mway Points 3407

D'après les commentaires de la documentation PHP, si vous êtes en mesure d'utiliser la ReflectionClass (PHP 5) :

function GetClassConstants($sClassName) {
    $oClass = new ReflectionClass($sClassName);
    return $oClass->getConstants();
}

La source est ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X