Могу ли я получить 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') 

Вы можете использовать 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 ) 

Эта

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

Используйте 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" 

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

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

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

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

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

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

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

Вывод:

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

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

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

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

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

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

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

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

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

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

Черта со статическим методом – на помощь

Похоже, это приятное место для использования черт со статическим методом для расширения функциональности класса. Черты также позволят нам реализовать эту функциональность в любом другом классе, не переписывая один и тот же код снова и снова (оставайтесь 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 )