web-dev-qa-db-fra.com

Puis-je obtenir CONST défini sur un PHP classe?

J'ai plusieurs CONST définis sur certaines classes et je souhaite 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 objets CONST définis dans la classe Profile? Autant que je sache, l'option la plus proche (get_defined_constants()) ne fera pas l'affaire.

Ce dont j'ai réellement besoin, c'est d'une liste de noms de constants - 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')
121
Brock Boland

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

<?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
)
215
Tom Haigh

Ce

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

Utilisez token_get_all () . À 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"
15
cletus

Selon les commentaires de la documentation PHP, si vous pouvez utiliser ReflectionClass (PHP 5):

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

La source est ici.

12
mway

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

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

Utiliser ReflectionClass et getConstants() donne exactement ce que vous voulez:

<?php
class Cl {
    const AAA = 1;
    const BBB = 2;
}
$r = new ReflectionClass('Cl');
print_r($r->getConstants());

Sortie:

Array
(
    [AAA] => 1
    [BBB] => 2
)
7
Ben James

Oui, vous utilisez réflexion . Regardez la sortie de

<?
Reflection::export(new ReflectionClass('YourClass'));
?>

Cela devrait vous donner une idée de ce que vous allez regarder.

4
chaos

Trait avec méthode statique - à la rescousse

On dirait que c'est un endroit agréable pour utiliser Traits avec une fonction statique pour étendre les fonctionnalités de classe. Traits nous permettra également d’implémenter cette fonctionnalité dans n’importe quelle autre classe sans réécrire le même code encore et encore (rester à sec).

Utilisez notre trait personnalisé 'ConstantExport' dans la classe Profile. Faites-le pour chaque classe pour laquelle vous avez besoin de cette fonctionnalité. 

/**
 * ConstantExport Trait implements getConstants() method which allows 
 * to return class constant as an assosiative array
 */
Trait ConstantExport 
{
    /**
     * @return [const_name => 'value', ...]
     */
    static function getConstants(){
        $refl = new \ReflectionClass(__CLASS__);
        return $refl->getConstants();
    }
}

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

    use ConstantExport;

}

Exemple d'utilisation

// So simple and so clean
$constList = Profile::getConstants(); 

print_r($constList); // TEST

LES SORTIES:

Array
(
    [LABEL_FIRST_NAME] => First Name
    [LABEL_LAST_NAME] => Last Name
    [LABEL_COMPANY_NAME] => Company
)
3
DevWL

Il est pratique d’avoir une méthode dans la classe pour renvoyer ses propres constantes.
Vous pouvez faire de cette façon:

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


    public static function getAllConsts() {
        return (new ReflectionClass(get_class()))->getConstants();
    }
}

// test
print_r(Profile::getAllConsts());
3
Luis Siquot

Pourquoi ne pas les mettre dans une variable de classe comme un tableau pour commencer? Le rend plus facile à boucler. 

private $_data = array("production"=>0 ...);
2
Detect

Finalement avec des espaces de noms:

namespaces enums;
class enumCountries 
{
  const CountryAustria          = 1 ;
  const CountrySweden           = 24;
  const CountryUnitedKingdom    = 25;
}

namespace Helpers;
class Helpers
{
  static function getCountries()
  {
    $c = new \ReflectionClass('\enums\enumCountries');
    return $c->getConstants();
  }
}

print_r(\Helpers\Helpers::getCountries());
2
revoke
Class Qwerty 
{
    const __COOKIE_LANG_NAME__ = "zxc";
    const __UPDATE_COOKIE__ = 30000;

    // [1]
    public function getConstants_(){

        return ['__COOKIE_LANG_NAME__' => self::__COOKIE_LANG_NAME__, 
                '__UPDATE_COOKIE__' => self::__UPDATE_COOKIE__]; 
    }    

    // [2]
    static function getConstantsStatic_(){

        return ['__COOKIE_LANG_NAME__' => self::__COOKIE_LANG_NAME__, 
                '__UPDATE_COOKIE__' => self::__UPDATE_COOKIE__]; 
    } 
}

// [1]
$objC = new Qwerty();
var_dump($objC->getConstants_());

// [2]
var_dump(Qwerty::getConstantsStatic_());