Могу ли я получить CONST, определенный в классе PHP?

У меня есть несколько CONST, определенных на некоторых классах, и вы хотите получить их список. Например:

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

Есть ли способ получить список CONST, определенный в классе Profile? Насколько я могу судить, ближайший вариант (get_defined_constants()) не будет делать трюк.

Мне действительно нужен список постоянных имен: что-то вроде этого:

array('LABEL_FIRST_NAME',
    'LABEL_LAST_NAME',
    'LABEL_COMPANY_NAME')

Или:

array('Profile::LABEL_FIRST_NAME', 
    'Profile::LABEL_LAST_NAME',
    'Profile::LABEL_COMPANY_NAME')

Или даже:

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

Ответ 1

Вы можете использовать Reflection для этого. Обратите внимание: если вы делаете это много, вы можете захотеть посмотреть на кеширование результата.

<?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());

Вывод:

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

Ответ 2

Это

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

Ответ 3

Используйте token_get_all(). А именно:

<?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";
}
?>

Вывод:

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

Ответ 4

В PHP5 вы можете использовать Reflection: (ручная ссылка)

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

Ответ 5

В комментариях к документам PHP, если вы можете использовать ReflectionClass (PHP 5):

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

Источник находится здесь.

Ответ 6

Использование ReflectionClass и getConstants() дает именно то, что вы хотите:

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

Вывод:

Array
(
    [AAA] => 1
    [BBB] => 2
)

Ответ 7

Да, вы используете reflection. Посмотрите на вывод

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

Это должно дать вам представление о том, что вы будете смотреть.

Ответ 8

Удобно иметь метод внутри класса для возврата своих собственных констант. Вы можете сделать так:

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());

Ответ 9

Почему бы не поместить их в переменную класса в качестве массива для начала? Делает это легче, чтобы петли через.

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

Ответ 10

В конце концов с пространствами имен:

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());

Ответ 11

Признак со статическим методом - на помощь

Похоже, что это приятное место для использования Traits со статическим методом для расширения функциональности класса. Черты также позволят нам реализовать эту функциональность в любом другом классе, не переписывая один и тот же код снова и снова (оставайтесь DRY).

Используйте наш пользовательский "ConstantExport" Trait с классом Profile. Сделайте это для каждого класса, в котором вам нужны эта функциональность.

/**
 * 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;

}

ПРИМЕР ИСПОЛЬЗОВАНИЯ

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

print_r($constList); // TEST

ВЫХОДЫ:

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